一、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创建过程的核心接口。其增强机制主要体现在两个关键阶段:
- 初始化前增强 通过实现
postProcessBeforeInitialization
方法,在Bean的以下生命周期节点介入:public Object postProcessBeforeInitialization(Object bean, String beanName) { // 可在此处修改Bean属性值 if(bean instanceof MyService) { ((MyService)bean).setConfig(defaultConfig); } return bean; }
- 初始化后增强 通过
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; }
@Override
public 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
中的自动配置类,通过条件判断决定是否生效。