Spring源码总结
Spring源码总结
IOC
Bean生命周期
graph LR
Bean创建-->初始化-->销毁
Bean的创建
- 单实例Bean:容器启动时创建
- 多实例Bean:第一次获取时创建
Bean初始化
属性赋值
1 | |
初始化之前
调用BeanPostProcessor的postProcessBeforeInitialization方法
自定义初始化方法
使用JSR250@PostConstruct注解,标注在初始化方法上(由于该注解的解析是通过BeanPostProcessor解析执行的,所以这种方式的初始化方法先执行)
实现InitializingBean接口,重写afterPropertiesSet方法
通过@Bean指定init方法
初始化执行顺序
graph LR PostConstruct注解-->InitializingBean-->Bean注解的init方法
初始化之后
调用BeanPostProcessor的postProcessAfterInitialization方法
Bean销毁
销毁的方式
使用JSR250@PreDestroy注解,标注在销毁方法上
实现DisposableBean接口,重新destroy方法
通过@Bean指定destroy方法
销毁执行的顺序
graph LR PreDestroy注解-->DisposableBean-->Bean注解的destroy方法
容器关闭时销毁,多实例Bean不会销毁,容器不管理多实例Bean
BeanPostProcessor
应用:
解析注解,并实现注解的功能,比如@Autowired、@Async等
AOP
核心注解
@EnableAspectJAutoProxy
Tips: EnableXXX注解,关注该注解给容器注册了什么组件,研究组件是如何工作的
1 | |
1 | |
给容器中注册一个名字为org.springframework.aop.config.internalAutoProxyCreator,类型为AnnotationAwareAspectJAutoProxyCreator的bean的定义信息,加入到BeanDefinitionRegistry中
1 | |
1 | |

核心类
AnnotationAwareAspectJAutoProxyCreator
AnnotationAwareAspectJAutoProxyCreator继承关系
- 实现了
BeanPostProcessor接口 - 实现了
BeanFActionyAware接口

BeanPostProcessor创建流程
sequenceDiagram
autonumber
Action-->>AnnotationConfigApplicationContext: register
Note right of Action: 注册配置类
Action-->>AnnotationConfigApplicationContext: refresh
Note right of Action: 刷新容器
AnnotationConfigApplicationContext-->>AbstractApplicationContext: refresh
AbstractApplicationContext-->>PostProcessorRegistrationDelegate: registerBeanPostProcessors
Note right of AbstractApplicationContext: 注册bean的后置处理器,拦截bean的创建
PostProcessorRegistrationDelegate-->>DefaultListableBeanFActiony: getBeanNamesForType
Note right of PostProcessorRegistrationDelegate: 根据类型获取BeanPostProcessor的名字
PostProcessorRegistrationDelegate-->>AbstractBeanFActiony: getBean
Note right of PostProcessorRegistrationDelegate: 根据BeanPostProcessor的名字获取Bean
AbstractBeanFActiony-->>AbstractBeanFActiony: doGetBean
AbstractBeanFActiony-->>DefaultSingletonBeanRegistry: getSingleton
DefaultSingletonBeanRegistry-->>DefaultSingletonBeanRegistry:singletonObjects
Note right of DefaultSingletonBeanRegistry: 首次调用为空,调用下面的方法
AbstractBeanFActiony-->>AbstractAutowireCapableBeanFActiony: createBean
AbstractAutowireCapableBeanFActiony-->>AbstractAutowireCapableBeanFActiony: createBeanInstance
Note right of AbstractBeanFActiony: 创建Bean
AbstractAutowireCapableBeanFActiony-->>AbstractAutowireCapableBeanFActiony: populateBean
Note right of AbstractAutowireCapableBeanFActiony: 给属性赋值
AbstractAutowireCapableBeanFActiony-->>AbstractAutowireCapableBeanFActiony: initializeBean
Note right of AbstractAutowireCapableBeanFActiony: 创建初始化bean
AbstractAutowireCapableBeanFActiony-->>AbstractAutowireCapableBeanFActiony: invokeAwareMethods
Note right of AbstractAutowireCapableBeanFActiony: 处理实现Aware接口的Bean(设置BeanName、ClassLoader、BeanFActiony)
AbstractAutowireCapableBeanFActiony-->>AnnotationAwareAspectJAutoProxyCreator: initBeanFActiony
Note right of AbstractAutowireCapableBeanFActiony: 初始化Bean工厂
AbstractAutowireCapableBeanFActiony-->>AbstractAutowireCapableBeanFActiony: applyBeanPostProcessorsBeforeInitialization
Note right of AbstractAutowireCapableBeanFActiony: 执行所有BeanPostProcessor前置处理方法
AbstractAutowireCapableBeanFActiony-->>AbstractAutowireCapableBeanFActiony: invokeInitMethods
Note right of AbstractAutowireCapableBeanFActiony: 执行bean的初始化方法
AbstractAutowireCapableBeanFActiony-->>AbstractAutowireCapableBeanFActiony: applyBeanPostProcessorsAfterInitialization
Note right of AbstractAutowireCapableBeanFActiony: 执行所有BeanPostProcessor后置处理方法
AbstractAutowireCapableBeanFActiony-->>PostProcessorRegistrationDelegate: addBeanPostProcessor
Note left of AbstractAutowireCapableBeanFActiony: 在bean工厂中加入BeanPostProcessor实例
代理对象的创建流程
createBean创建代理对象或者真正的Bean对象
sequenceDiagram
autonumber
Action-->>AbstractAutowireCapableBeanFActiony:createBean
AbstractAutowireCapableBeanFActiony-->>AbstractAutowireCapableBeanFActiony:resolveBeforeInstantiation
AbstractAutowireCapableBeanFActiony-->>AbstractAutowireCapableBeanFActiony:applyBeanPostProcessorsBeforeInstantiation
AbstractAutowireCapableBeanFActiony-->>AbstractAutoProxyCreator:postProcessBeforeInstantiation
AbstractAutowireCapableBeanFActiony-->>AbstractAutowireCapableBeanFActiony:applyBeanPostProcessorsAfterInitialization
AbstractAutowireCapableBeanFActiony-->>AbstractAutoProxyCreator:postProcessAfterInitialization
AbstractAutoProxyCreator-->>AbstractAutoProxyCreator:wrapIfNecessary
Note right of AbstractAutoProxyCreator: 获取当前Bean可用的增强器,即切面方法
AbstractAutoProxyCreator-->>AbstractAutoProxyCreator: getAdvicesAndAdvisorsForBean
Note right of AbstractAutoProxyCreator: 获取可用的增强器并排序,返回一个拦截器数组
AbstractAdvisorAutoProxyCreator-->>AbstractAdvisorAutoProxyCreator:findEligibleAdvisors
Note right of AbstractAdvisorAutoProxyCreator: 找到可用的增强器
AspectJAwareAdvisorAutoProxyCreator-->>AbstractAdvisorAutoProxyCreator:findCandidateAdvisors
Note right of AspectJAwareAdvisorAutoProxyCreator: 找到所有候选的增强器
AbstractAdvisorAutoProxyCreator-->>AbstractAdvisorAutoProxyCreator:findAdvisorsThatCanApply
Note right of AbstractAdvisorAutoProxyCreator: 过滤增强器并返回
AbstractAutoProxyCreator-->>AbstractAutoProxyCreator:createProxy
Note right of AbstractAutoProxyCreator: 创建代理对象
ProxyFActiony-->>DefaultAopProxyFActiony:createAopProxy
Note right of ProxyFActiony: 用代理工厂创建代理对象
DefaultAopProxyFActiony-->>JdkDynamicAopProxy:JdkDynamicAopProxy
Note right of DefaultAopProxyFActiony:创建JDK代理
DefaultAopProxyFActiony-->>ObjenesisCglibAopProxy:ObjenesisCglibAopProxy
Note right of DefaultAopProxyFActiony:创建Cglib代理
AbstractAutowireCapableBeanFActiony-->>AbstractAutowireCapableBeanFActiony: doCreateBean
Note right of AbstractAutowireCapableBeanFActiony: 创建真正的Bean对象
代理对象的执行流程
sequenceDiagram
autonumber
Action-->>代理对象:xxx方法
代理对象-->>DynamicAdvisedInterceptor:intercept
Note right of 代理对象: 拦截代理对象的目标方法(DynamicAdvisedInterceptor是CglibAopProxy的内部类)
DynamicAdvisedInterceptor-->>AdvisedSupport:getInterceptorsAndDynamicInterceptionAdvice
Note right of DynamicAdvisedInterceptor: 根据代理工厂获取目标方法的拦截器链
DynamicAdvisedInterceptor-->>MethodProxy:invoke
Note right of DynamicAdvisedInterceptor: 如果没有拦截器链,则直接执行目标方法
DynamicAdvisedInterceptor-->>CglibMethodInvocation:CglibMethodInvocation:proceed
Note right of DynamicAdvisedInterceptor: 如果存在拦截器链,则创建一个CglibMethodInvocation对象并调用proceed方法
Spring事务
- 在配置类中开启事务管理 @EnableTransactionManagement
- 在配置类中注册事务管理器 PlatformTransactionManager
- 在需要事务的service上加上Transactional注解