当前位置: 首页 > news >正文

Spring生态的核心思想

一、Spring Framework

1. IoC容器:依赖管理

        Spring的核心是控制反转(IoC),它通过容器管理对象的生命周期和依赖关系。以ApplicationContext为例,其初始化过程涉及Bean定义的加载、解析和实例化:

// Bean定义加载过程
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
context.register(AppConfig.class); // 注册配置类
context.refresh(); // 触发BeanFactory的初始化
UserService userService = context.getBean(UserService.class); // 获取Bean

refresh()方法调用AbstractApplicationContext中的obtainFreshBeanFactory(),触发BeanFactory的创建,随后通过BeanPostProcessor对Bean进行增强。

        在Spring框架中,BeanPostProcessor是用于干预Bean创建过程的核心接口。其增强机制主要体现在两个关键阶段:

  1. 初始化前增强 通过实现postProcessBeforeInitialization方法,在Bean的以下生命周期节点介入:
    public Object postProcessBeforeInitialization(Object bean, String beanName) {// 可在此处修改Bean属性值if(bean instanceof MyService) {((MyService)bean).setConfig(defaultConfig);}return bean;
    }

  2. 初始化后增强 通过postProcessAfterInitialization方法,在Bean完成初始化后进行处理。典型应用是创建AOP代理:
    public Object postProcessAfterInitialization(Object bean, String beanName) {if(bean.getClass().isAnnotationPresent(Transactional.class)) {return Proxy.newProxyInstance(...); // 生成事务代理}return bean;
    }

2. AOP:面向切面

        AOP通过动态代理实现日志、事务等通用逻辑的横向切入。以下是一个JDK动态代理的简化实现:

public class JdkDynamicProxy implements InvocationHandler {private Object target;public JdkDynamicProxy(Object target) { this.target = target; }@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("Before method: " + method.getName());Object result = method.invoke(target, args);System.out.println("After method: " + method.getName());return result;}
}
// 使用代理
UserService proxy = (UserService) Proxy.newProxyInstance(UserService.class.getClassLoader(),new Class[]{UserService.class},new JdkDynamicProxy(new UserServiceImpl())
);

AOP的本质是分离,使得业务逻辑与系统服务(如事务)解耦。

3. 数据访问与事务管理

        Spring通过JdbcTemplate简化JDBC操作,其核心在于模板方法模式的应用:

public class JdbcTemplate {public <T> T query(String sql, ResultSetExtractor<T> extractor) {Connection con = DataSourceUtils.getConnection(dataSource);Statement stmt = con.createStatement();ResultSet rs = stmt.executeQuery(sql);return extractor.extractData(rs); // 回调处理结果集}
}

        事务管理则通过@Transactional注解与AOP结合,利用事务拦截器在方法调用前后开启/提交事务。

二、Spring Boot:约定大于配置

1. 自动装配:条件化Bean加载

        Spring Boot的自动装配基于@Conditional注解族实现。以DataSourceAutoConfiguration为例:

@Configuration
@ConditionalOnClass({DataSource.class, EmbeddedDatabaseType.class}) // 类路径存在时生效
@EnableConfigurationProperties(DataSourceProperties.class) // 绑定配置
public class DataSourceAutoConfiguration {@Bean@ConditionalOnMissingBean // 当用户未自定义DataSource时生效public DataSource dataSource(DataSourceProperties properties) {return properties.initializeDataSourceBuilder().build();}
}

启动流程SpringApplication.run()触发SpringFactoriesLoader加载META-INF/spring.factories中的自动配置类,通过条件判断决定是否生效。

    相关文章:

  1. Robust Kernel Estimation with Outliers Handling for Image Deblurring论文阅读
  2. 算法修仙传 第一章 灵根觉醒:数组基础与遍历
  3. 第十节第七部分:Arrays类、自定义排序规则Comparable、自定义比较器Comparator
  4. 计算机组成原理-基本运算部件定点数的运算
  5. JavaScript的三大核心组成:ECMAScript、DOM与BOM
  6. pytdx数据获取:在线获取和离线获取(8年前的东西,还能用吗?)
  7. 分布式事务Seata-核心问题
  8. 【C语言练习】058. 编写函数连接两个字符串
  9. 计算机网络——每一层的用到的设备及其作用
  10. 打破双亲委派模型的实践:JDBC与Tomcat的深度解析
  11. 高效记单词:以load为例,让我们逐水而生
  12. 数据采集器实现电源动态能耗追踪的组网配置方案
  13. Java中的Switch Case多个条件
  14. Vue-js
  15. wsl2 不能联网
  16. 从零搭建SpringBoot Web单体项目3、SpringBoot 核心组件深度解析
  17. 【JVM 03-JVM内存结构之-虚拟机栈】
  18. 解释一下NGINX的反向代理和正向代理的区别?
  19. Nginx中root与alias的区别及用法
  20. 如何使用WordPress区块(以及如何创建自定义区块)?
  21. 电子商务官方网站/百度网络优化推广公司
  22. 做那种事免费网站/滕州百度推广
  23. 企业网站建设的基本原则/排名前50名免费的网站
  24. 网站建设企业宣传册/网站建设山东聚搜网络
  25. 做软件赚钱的网站有哪些/友情链接管理系统
  26. 用返利网站做爆款/免费下载百度软件