Spring 框架核心机制深度解析(玩转开源代码)
一、Bean 生命周期全流程剖析
1.1 核心生命周期阶段
以下是 Spring Bean 生命周期核心阶段的配图,结合实际流程图示清晰展现每一步执行顺序及扩展点挂载位置。
🧬Spring Bean 生命周期流程图
graph TD
A[加载 BeanDefinition] --> B{postProcessBeforeInstantiation?}
B -->|是| C[返回代理对象 -> 初始化完成]
B -->|否| D[实例化 Bean(Constructor)]
D --> E{postProcessAfterInstantiation?}
E -->|false| Z[终止后续流程]
E -->|true| F[属性注入 populateBean]
F --> G[postProcessProperties(依赖注入)]
G --> H[执行 @Autowired/@Resource 等注解注入]
H --> I[调用 BeanNameAware 等 Aware 接口]
I --> J[postProcessBeforeInitialization]
J --> K[执行初始化方法(@PostConstruct / InitializingBean)]
K --> L[postProcessAfterInitialization]
L --> M[注册销毁回调(DisposableBean / @PreDestroy)]
M --> N[完成创建 -> 放入单例池]
📌 说明:
postProcessBeforeInstantiation
:拦截实例化前,可直接返回代理跳过后续流程。postProcessAfterInstantiation
:控制是否进行属性注入。postProcessProperties
:注解驱动的依赖注入处理器(如@Autowired
)。postProcessBefore/AfterInitialization
:通常用于 AOP 代理封装。InitializingBean/@PostConstruct
:执行开发者定义的初始化逻辑。- 最后阶段将 Bean 放入单例池,并注册销毁逻辑。
// AbstractAutowireCapableBeanFactory.java
protected Object doCreateBean(String beanName, RootBeanDefinition mbd, Object[] args) {
// 1. 实例化阶段
Object bean = instanceWrapper.getWrappedInstance();
// 2. 属性填充阶段
populateBean(beanName, mbd, instanceWrapper);
// 3. 初始化阶段
exposedObject = initializeBean(beanName, exposedObject, mbd);
return exposedObject;
}
1.2 InstantiationAwareBeanPostProcessor 关键拦截点
1.2.1 实例化前拦截 (postProcessBeforeInstantiation)
// AbstractAutowireCapableBeanFactory.java
protected Object resolveBeforeInstantiation(String beanName, RootBeanDefinition mbd) {
if (!Boolean.FALSE.equals(mbd.beforeInstantiationResolved)) {
for (BeanPostProcessor bp : getBeanPostProcessors()) {
if (bp instanceof InstantiationAwareBeanPostProcessor) {
Object result = ((InstantiationAwareBeanPostProcessor) bp)
.postProcessBeforeInstantiation(beanClass, beanName);
if (result != null) {
// 直接返回代理对象,跳过后续标准流程
return applyBeanPostProcessorsAfterInitialization(result, beanName);
}
}
}
mbd.beforeInstantiationResolved = Boolean.TRUE;
}
return null;
}
关键特性:
- 返回非空对象会完全替代原始 Bean
- 常用于提前生成代理(如 LoadTimeWeaving)
1.2.2 实例化后处理 (postProcessAfterInstantiation)
// AbstractAutowireCapableBeanFactory.java
protected void populateBean(String beanName, RootBeanDefinition mbd, BeanWrapper bw) {
boolean continueWithPropertyPopulation = true;
for (BeanPostProcessor bp : getBeanPostProcessors()) {
if (bp instanceof InstantiationAwareBeanPostProcessor) {
if (!((InstantiationAwareBeanPostProcessor) bp)
.postProcessAfterInstantiation(bw.getWrappedInstance(), beanName)) {
continueWithPropertyPopulation = false;
break;
}
}
}
if (!continueWithPropertyPopulation) return;
// 执行属性注入...
}
作用:控制是否进行属性注入
1.2.3 属性处理 (postProcessProperties)
// CommonAnnotationBeanPostProcessor.java
public PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName) {
// 处理 @Resource 注解注入
InjectionMetadata metadata = findResourceMetadata(beanName, bean.getClass(), pvs);
try {
metadata.inject(bean, beanName, pvs);
}
catch (Throwable ex) {
throw new BeanCreationException(...);
}
return pvs;
}
1.3 初始化阶段扩展点
回调接口 | 执行时机 | 典型应用场景 |
---|---|---|
BeanPostProcessor | 初始化前后 | 代理增强(AOP) |
InitializingBean | 属性设置后 | 自定义初始化逻辑 |
@PostConstruct | 初始化方法阶段 | 生命周期回调 |
SmartInitializingSingleton | 所有单例初始化完成后 | 应用启动后操作 |
二、AOP 实现机制深度解析
2.1 AOP 代理创建流程
二、AOP代理创建流程
2.1 代理创建决策流程图
graph TD
A[创建ProxyFactory实例] --> B[设置目标对象和切面配置]
B --> C[调用getProxy()]
C --> D{是否设置proxyTargetClass或目标类无接口?}
D -->|是| E{目标类是否是接口或已是代理类?}
E -->|是| F[JDK动态代理]
E -->|否| G[CGLIB动态代理]
D -->|否| F
F --> H[生成代理对象]
G --> H
代理选择策略:
- JDK代理:要求目标类至少实现一个接口
- CGLIB代理:通过生成子类实现代理,需注意final方法限制
proxyTargetClass=true
强制使用CGLIB
📌 说明:
- ProxyFactory:核心代理工厂,封装代理创建逻辑。
- proxyTargetClass=true 或目标类无接口:优先选择 CGLIB。
- JDK 动态代理:代理接口,轻量高效。
- CGLIB 代理:子类代理,适用于无接口的类。
- AopProxy 实例:真正生成代理对象的实现类。
2.1.1 代理工厂核心配置
// ProxyFactory.java
public class ProxyFactory extends ProxyCreatorSupport {
public Object getProxy(ClassLoader classLoader) {
if (this.proxyInterfaces.length == 0 && !isProxyTargetClass()) {
// 自动检测接口
Class<?> targetClass = getTargetClass();
if (targetClass != null) {
setInterfaces(ClassUtils.getAllInterfacesForClass(targetClass, classLoader));
}
}
// 创建 AopProxy 实例
AopProxy aopProxy = createAopProxy();
return aopProxy.getProxy(classLoader);
}
}
2.1.2 代理类型选择策略
// DefaultAopProxyFactory.java
public AopProxy createAopProxy(AdvisedSupport config) {
if (config.isOptimize() || config.isProxyTargetClass() || hasNoUserSuppliedProxyInterfaces(config)) {
Class<?> targetClass = config.getTargetClass();
if (targetClass.isInterface() || Proxy.isProxyClass(targetClass)) {
return new JdkDynamicAopProxy(config);
}
return new ObjenesisCglibAopProxy(config);
}
else {
return new JdkDynamicAopProxy(config);
}
}
2.2 拦截器链执行机制(拦截器调用时序图)
执行特点:
- 责任链模式实现
- 递归调用机制(proceed()方法推动链式执行)
- 执行顺序:前置通知 -> 目标方法 -> 后置通知(实际为嵌套执行)
📌 说明:
- 拦截器链(Interceptor Chain):本质是一个环状递归结构,每个拦截器执行完后调用
proceed()
进入下一个。 ReflectiveMethodInvocation
是关键入口,按顺序调用所有增强方法。- 当最后一个拦截器执行完毕后,进入
invokeJoinpoint()
,即目标方法本体。 - 执行顺序符合“洋葱模型”:进入是从外到内,返回是从内到外。
2.2.1 拦截器链构建
// DefaultAdvisorChainFactory.java
public List<Object> getInterceptorsAndDynamicInterceptionAdvice(
Advised config, Method method, Class<?> targetClass) {
List<Object> interceptorList = new ArrayList<>(config.getAdvisors().length);
for (Advisor advisor : config.getAdvisors()) {
if (advisor instanceof PointcutAdvisor) {
PointcutAdvisor pointcutAdvisor = (PointcutAdvisor) advisor;
if (pointcutAdvisor.getPointcut().getClassFilter().matches(targetClass)) {
MethodInterceptor[] interceptors = registry.getInterceptors(advisor);
MethodMatcher mm = pointcutAdvisor.getPointcut().getMethodMatcher();
if (MethodMatchers.matches(mm, method, targetClass, hasIntroductions)) {
interceptorList.addAll(Arrays.asList(interceptors));
}
}
}
}
return interceptorList;
}
2.2.2 方法调用堆栈
// ReflectiveMethodInvocation.java
public Object proceed() throws Throwable {
if (this.currentInterceptorIndex == this.interceptorsAndDynamicMethodMatchers.size() - 1) {
return invokeJoinpoint(); // 执行原始方法
}
Object interceptorOrInterceptionAdvice =
this.interceptorsAndDynamicMethodMatchers.get(++this.currentInterceptorIndex);
if (interceptorOrInterceptionAdvice instanceof MethodInterceptor) {
MethodInterceptor mi = (MethodInterceptor) interceptorOrInterceptionAdvice;
return mi.invoke(this);
}
else {
// 动态匹配处理
return ((InterceptorAndDynamicMethodMatcher) interceptorOrInterceptionAdvice)
.methodMatcher.matches(...) ? mi.invoke(this) : proceed();
}
}
三、事务管理实现机制
3.1 事务传播机制实现
// AbstractPlatformTransactionManager.java
private TransactionStatus handleExistingTransaction(
TransactionDefinition definition, Object transaction, boolean debugEnabled) {
if (definition.getPropagationBehavior() == TransactionDefinition.PROPAGATION_NEVER) {
throw new IllegalTransactionStateException(...);
}
if (definition.getPropagationBehavior() == TransactionDefinition.PROPAGATION_NOT_SUPPORTED) {
Object suspendedResources = suspend(transaction);
return newTransactionStatus(
definition, null, false, newSynchronization, debugEnabled, suspendedResources);
}
if (definition.getPropagationBehavior() == TransactionDefinition.PROPAGATION_REQUIRES_NEW) {
SuspendedResourcesHolder suspendedResources = suspend(transaction);
return startTransaction(definition, transaction, debugEnabled, suspendedResources);
}
// 其他传播行为处理...
}
3.2 事务同步管理
// TransactionSynchronizationManager.java
public abstract class TransactionSynchronizationManager {
private static final ThreadLocal<Map<Object, Object>> resources =
new NamedThreadLocal<>("Transactional resources");
private static final ThreadLocal<Set<TransactionSynchronization>> synchronizations =
new NamedThreadLocal<>("Transaction synchronizations");
public static void bindResource(Object key, Object value) {
Map<Object, Object> map = resources.get();
if (map == null) {
map = new HashMap<>();
resources.set(map);
}
Object oldValue = map.put(key, value);
if (oldValue != null) {
throw new IllegalStateException(...);
}
}
}
3.3 事务异常处理机制
// TransactionAspectSupport.java
protected void completeTransactionAfterThrowing(@Nullable TransactionInfo txInfo, Throwable ex) {
if (txInfo != null && txInfo.getTransactionStatus() != null) {
if (txInfo.transactionAttribute != null && txInfo.transactionAttribute.rollbackOn(ex)) {
try {
txInfo.getTransactionManager().rollback(txInfo.getTransactionStatus());
}
catch (TransactionSystemException ex2) {
// 处理回滚失败
}
}
else {
try {
txInfo.getTransactionManager().commit(txInfo.getTransactionStatus());
}
catch (TransactionSystemException ex2) {
// 处理提交异常
}
}
}
}
事务回滚规则矩阵:
异常类型 | 默认回滚? | 可配置覆盖 |
---|---|---|
RuntimeException | 是 | 可通过 @Transactional 修改 |
Checked Exception | 否 | 可配置 rollbackFor |
Error | 是 | 不可修改 |
四、核心设计模式应用
4.1 模板方法模式
- 应用场景:
AbstractAutowireCapableBeanFactory
的 createBean 方法 - 实现方式:
protected Object createBean(...) { // 前置处理 Object bean = resolveBeforeInstantiation(...); if (bean != null) return bean; // 标准创建流程 return doCreateBean(...); } protected abstract Object doCreateBean(...);
4.2 责任链模式
- 应用场景:BeanPostProcessor 调用链、AOP 拦截器链
- 典型实现:
// AbstractAdvisorAutoProxyCreator.java public Object postProcessAfterInitialization(Object bean, String beanName) { if (bean instanceof AopInfrastructureBean) { return bean; } return wrapIfNecessary(bean, beanName); }
4.3 代理模式
- JDK 动态代理示例:
public class JdkDynamicProxy implements InvocationHandler { private final Object target; public Object invoke(Object proxy, Method method, Object[] args) { // 前置处理 Object result = method.invoke(target, args); // 后置处理 return result; } }
五、性能优化建议
-
Bean 生命周期优化:
- 避免在 BeanPostProcessor 中进行耗时操作
- 合理使用 lazy-init 延迟初始化
-
AOP 优化策略:
- 精确配置切点表达式减少匹配开销
- 优先使用 JDK 动态代理(生成速度更快)
-
事务管理优化:
- 合理设置事务超时时间
- 避免在事务方法中进行远程调用
本解析文档结合 Spring Framework 5.3.x 版本源码实现,深入剖析了 Spring 框架的核心工作机制。建议结合官方文档和实际调试进行验证,以加深对底层原理的理解。