Spring源码总结

Spring源码总结

IOC

Bean生命周期

graph LR
Bean创建-->初始化-->销毁
Bean的创建
  • 单实例Bean:容器启动时创建
  • 多实例Bean:第一次获取时创建
Bean初始化
属性赋值
1
2
// 给属性赋值
populateBean(beanName, mbd, instanceWrapper);
初始化之前

​ 调用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
2
3
4
@Import(AspectJAutoProxyRegistrar.class)
public @interface EnableAspectJAutoProxy {
...
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class AspectJAutoProxyRegistrar implements ImportBeanDefinitionRegistrar {

/**
* Register, escalate, and configure the AspectJ auto proxy creator based on the value
* of the @{@link EnableAspectJAutoProxy#proxyTargetClass()} attribute on the importing
* {@code @Configuration} class.
*/
@Override
public void registerBeanDefinitions(
AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {

AopConfigUtils.registerAspectJAnnotationAutoProxyCreatorIfNecessary(registry);

......
}

给容器中注册一个名字为org.springframework.aop.config.internalAutoProxyCreator,类型为AnnotationAwareAspectJAutoProxyCreator的bean的定义信息,加入到BeanDefinitionRegistry

1
2
public static final String AUTO_PROXY_CREATOR_BEAN_NAME =
"org.springframework.aop.config.internalAutoProxyCreator";
1
2
3
4
5
6
7
8
9
10
11
@Nullable
private static BeanDefinition registerOrEscalateApcAsRequired(
Class<?> cls, BeanDefinitionRegistry registry, @Nullable Object source) {
......
RootBeanDefinition beanDefinition = new RootBeanDefinition(cls);
beanDefinition.setSource(source);
beanDefinition.getPropertyValues().add("order", Ordered.HIGHEST_PRECEDENCE);
beanDefinition.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
registry.registerBeanDefinition(AUTO_PROXY_CREATOR_BEAN_NAME, beanDefinition);
return beanDefinition;
}

image-20220403205011466

核心类

AnnotationAwareAspectJAutoProxyCreator

AnnotationAwareAspectJAutoProxyCreator继承关系

  • 实现了BeanPostProcessor接口
  • 实现了BeanFActionyAware接口

AnnotationAwareAspectJAutoProxyCreator

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事务

  1. 在配置类中开启事务管理 @EnableTransactionManagement
  2. 在配置类中注册事务管理器 PlatformTransactionManager
  3. 在需要事务的service上加上Transactional注解

Spring源码总结
http://example.com/2023/03/09/框架/Spring/Spring源码总结/
作者
UncleBryan
发布于
2023年3月9日
许可协议