Spring源码阅读随记 (一)のSpring的IOC流程

之前阅读Spring画的图和笔记,有误的话请多加指正。
在这里插入图片描述

1.初始化AnnotationBeanDefinitionReader(创建一个读取注解的BeanDefinition读取器)

1)完成一些Spring内置的bean的BeanDefinition的注册到beanDefinitionMap

​ (1) ConfigurationClassPostProcessor -> BeanDefinitionRegistryPostProcessor -> BeanFactoryPostProcessor

​ (2) AutowiredAnnotationBeanPostProcessor -> BeanPostProcessor

​ (3) CommonAnnotationBeanPostProcessor -> BeanPostProcessor

​ (4) EventListenerMethodProcessor -> BeanFactoryPostProcessor

​ (5) DefaultEventListenerFactory

2.初始化ClassPathBeanDefinitionScanner(创建BeanDefinition扫描器)

1)这里的scanner仅仅是为了程序员可以手动调用AnnotationConfigApplicationContext对象的scan方法

​ (1) spring默认的扫描包不是这个scanner对象,而是自己new的一个ClassPathBeanDefinitionScanner

​ (2) spring在执行工程后置处理器ConfigurationClassPostProcessor时,去扫描包时会new一个ClassPathBeanDefinitionScanner

3.执行register()方法,注册我们的配置类

1)调用AnnotatedBeanDefinitionReader.doRegisterBean()方法,将我们设置的配置类注册到beanDefinitionMap

4.调用refresh()方法

1)prepareRefresh()

​ (1)获取容器的当前时间,同时给容器设置同步标识

2)ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();

​ (1)设置一个Id,返回一个DefaultListableBeanFactory

3)prepareBeanFactory(beanFactory); BeanFactory的预处理工作(DefaultListableBeanFactory)

​ (1)设置BeanFactory的类加载器、EL表达式解析器、属性注册解析器PropertyEditor

​ (2)添加BeanPostProcessor[ApplicationContextAwareProcessor],能够在bean中获得各种*Aware

​ (3)为beanFactory设置忽略自动装配的接口EnvironmentAware、EmbeddedValueResolverAware、ResourceLoaderAware、ApplicationEventPublisherAware、MessageSourceAware、ApplicationContextAware

​ (4)设置可以自动装配的类BeanFactory、ResourceLoader、ApplicationEventPublisher、ApplicationContext

​ (5)添加BeanPostProcessor[ApplicationListenerDetector], 处理事件监听器

​ (6)添加编译时的AspectJ[LoadTimeWeaverAwareProcessor]

​ (7)给BeanFactory中注册一些环境组件

4)postProcessBeanFactory(beanFactory)

​ (1)设置BeanFactory的后置处理器,spring中并没有具体去实现postProcessBeanFactory方法

5)invokeBeanFactoryPostProcessors(beanFactory):主要完成自定义的或者内置BeanDefinitionRegistryPostProcessor、BeanFactoryPostProcessor的方法,重要的ConfigurationClassPostProcessor完成了扫描->class->注册到beanDefinitionMap中
(1)getBeanFactoryPostProcessors() 获取自定义的BeanFactoryPostProcessor实现类
(2)PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors:实例化并调用所有已注册的BeanFactoryPostProcessor

​ ①执行通过ac.addBeanFactoryPostProcessor添加的BeanDefinitionRegistryPostProcessorpostProcessBeanDefinitionRegistry方法

​ ②执行【Spring内置】的BeanDefinitionRegistryPostProcessor[ConfigurationClassPostProcessor]

​ 通过 ConfigurationClassPostProcessor再去【扫描】自定义的BeanDefinitionRegistryPostProcessorBeanFactoryPostProcessor

​ ③执行通过【扫描】的【自定义】的BeanDefinitionRegistryPostProcessorpostProcessBeanDefinitionRegistry方法

​ 先执行实现了PriorityOrdered接口的

​ 再执行实现了Ordered接口的

​ 然后再实现其他的

​ ④执行所有BeanDefinitionRegistryPostProcessor实现类的postProcessBeanFactory方法

​ ⑤执行通过ac.addBeanFactoryPostProcessor添加的普通BeanFactoryPostProcessorpostProcessBeanFactory方法

​ ⑥调用所有的普通BeanFactoryPostProcessorpostProcessBeanFactory方法

​ 先执行实现了PriorityOrdered接口的

​ 再执行实现了Ordered接口的

​ 然后再实现其他的

Spring的内部实现类ConfigurationClassPostProcessor,主要完成

(1)postProcessBeanDefinitionRegistry:扫描 得到class 并转换成BeanDefinition,并注册到beanDefinitionMap中

(2)postProcessBeanFactory:对加了@Configuration注解的配置类进行Cglib代理,添加一个BeanPostProcessor后置处理器ImportAwareBeanPostProcessor
6)registerBeanPostProcessors(beanFactory):注册BeanPostProcessor,把每个BeanPostProcessor设置到beanFactory的beanPostProcessors
7)initMessageSource():初始化上下文中的资源文件,如国际化文件的处理
8)initApplicationEventMulticaster():初始化上下文事件广播器,添加到BeanFactory中,以后其他组件直接注入
9)onRefresh()
10)finishBeanFactoryInitialization(beanFactory);将BeanDefinition变成bean,所有非延迟单例对象的实例化

​ ①遍历所有的已经注册的beanDefinitionNames,根据名称得到BeanDefinition -> RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);

​ ②通过AbstractBeanFactory#doGetBean将beanDefinition实例化成bean

​ (2.1)第一次getSingleton(),一般返回null

​ a.从一级缓存singletonObjects (存放完整的Bean)拿,一般不存在返回null

​ b.如果在正常创建的bean集合中,从二级缓存earlySingletonObjects拿,存的是代理bean工厂

​ c.如果二级缓存不存在,且allowEarlyReference允许提前创建,从三级缓存singletonFactories中拿,存的是对应的 ObjectFactory(半成品bean)

​ (2.2)将beanName放到alreadyCreated缓存,并清除MergedBeanDefinition -> markBeanAsCreated(beanName)

​ (2.3)根据beanName重新获取MergedBeanDefinition -> final RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName)

​ (2.4)检查dependsOn,如果有dependsOn先初始化依赖的bean

​ (2.5)第二次getSingleton,

​ a. 从singletonObjects获取,一般不存在

​ b. 初始化Bean -> createBean()

​ Ⅰ .解析beanName对应的Bean的类型 -> Class<?> resolvedClass = resolveBeanClass(mbd, beanName);

​ Ⅱ:如果BeanFactory中存在InstantiationAwareBeanPostProcessor,执行postProcessBeforeInstantiation,AOP的核心

​ Ⅲ:创建Bean对象 -> Object beanInstance = doCreateBean(beanName, mbdToUse, args);反射来实例化对象

​ Ⅳ:MergedBeanDefinitionPostProcessors后置处理修改 BeanDefinition

​ Ⅴ:如果BeanFactory中存在InstantiationAwareBeanPostProcessor,执行postProcessAfterInstantiation -> populateBean -> ibp.postProcessAfterInstantiation

​ Ⅵ:对 bean 进行属性填充 -> populateBean(beanName, mbd, instanceWrapper);

​ Ⅶ:执行部分group1-Aware:BeanNameAware、BeanClassLoaderAware、BeanFactoryAware ->initializeBean()开始

​ 执行部分group2-Aware:ApplicationContextAwareProcessor -> applyBeanPostProcessorsBeforeInitialization()

​ Ⅷ:在初始化前调用BeanPostProcessor的postProcessBeforeInitialization方法,允许对bean实例进行包装 -> applyBeanPostProcessorsBeforeInitialization()

​ Ⅸ:执行注解版的生命周期初始化回调方法

​ Ⅹ:调用接口版的生命周期初始化回调方法,调用afterPropertiesSet方法,调用自定义初始化方法init-method

​ ⅩⅠ :在初始化后调用BeanPostProcessor的postProcessAfterInitialization方法,允许对bean实例进行包装,完成aop—生成代理,事件发布、监听 -> initializeBean 结束

​ c. 将单例对象放到单例池singletonObjects中

11)销毁
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值