spring扫描bean总结

目的

扫描bean的原理@Configuration源码
这之间的几篇关于spring源码的博客,都是围绕着一个方法来解析的

invokeBeanFactoryPostProcessors(beanFactory);
org.springframework.context.support.AbstractApplicationContext#invokeBeanFactoryPostProcessors

所以,打算在这篇博客中,对这个方法做一个小总结

  1. 在进入到该方法的时候,首先会执行程序员通过api(ac.addBeanFactoryPostProcessor();)注入的BeanFactoryPostProcessor的实现类(这里需要注意:如果一个类实现了BeanFactoryPostProcessor或者实现了BeanDefinitionRegistryPostProcessor接口,我们都可以称之为BeanFactoryPostProcessor的实现类)
  2. 会先执行上面第一步注入的BeanFactoryPostProcessor的子接口BeanDefinitionRegistryPostProcessor对应的实现类,此时,执行的就是程序员自己实现的业务逻辑代码,但是这种场景应该会比较少吧,因为毕竟这时候,连bean都还没有扫描到beanDefinitionMap中,但是既然spring提供了响应的扩展点,总归是会有用到的场景
  3. 如果程序员没有通过api提供实现类,那么会从beanDefinitionMap中获取BeanDefinitionRegistryPostProcessor的实现类。理论上而言,这时候,只会获取到一个,就是ConfigurationClassPostProcessor,这里原因就不解释了,在前面的博客中有说到过
  4. 会先执行org.springframework.context.annotation.ConfigurationClassPostProcessor#postProcessBeanDefinitionRegistry 在这里,完成了对bean的扫描(@ComponentScan注解、@Bean、@Import注解),这个方法执行完之后,会把程序员提供的业务类扫描到beanDefinitionMap中
  5. 在将业务bean扫描到beanDefinitionMap中之后,会从beanDefinitionMap中获取BeanDefinitionRegistryPostProcessor的实现类,会按照以下优先级,先后执行,实现了PriorityOrdered > 实现了 Ordered > 普遍的BeanDefinitionRegistryPostProcessor实现类;这里为什么要这么做?因为有可能程序员自己也提供了BeanDefinitionRegistryPostProcessor或者BeanFactoryPostProcessor的实现类;所以,要扫描执行程序员提供的业务逻辑
  6. 执行完BeanDefinitionRegistryPostProcessor的postProcessBeanDefinitionRegistry方法之后,接着要执行BeanFactoryPostProcessor的postProcessBeanFactory方法
  7. ①、先执行spring内置的、通过注解注入的、通过API注入的,BeanDefinitionRegistryPostProcessor实现类中对应的postProcessorBeanFactory方法(因为一个实现类,实现BeanDefinitionRegistryPostProcessor的方法时,必然要实现BeanFactoryPostProcessor接口中的方法)
    ②、再执行程序员通过API的方式注入的BeanFactoryPostProcessor实现类对应的postProcessorBeanFactory方法
    ③、执行程序员通过注解方式注入的BeanFactoryPostProcessor的实现类;按照以下优先级先后执行:实现了PriorityOrdered接口的实现类先执行 > 实现了Ordered接口的实现类先执行 > 普通的BeanFactoryPostProcessor实现类最后执行

上面的这个流程中,在第7.①、这里,执行到ConfigurationClassPostProcessor的postProcessBeanFactory方法的时候,会对全配置类(加了@Configuration)生成代理对象

所以,在spring源码中的这一步,就是对org.springframework.beans.factory.config.BeanFactoryPostProcessor#postProcessBeanFactory 和 org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor#postProcessBeanDefinitionRegistry这两个接口的实现类的处理,只是在处理的时候,会有先后的顺序,接口实现类有执行的先后顺序,程序员提供的扩展类和spring内置的实现类有先后的执行顺序,所以,大体上,要先把执行时机和顺序理清楚,然后再一步一步扣每个方法的细节

所以,对于BeanFactoryPostProcesosr和BeanDefinitionRegistryPostProcessor的执行先后顺序,我也整理了一下:

1.首先执行BeanDefinitionRegistryPostProcessor的实现类
	1.1 首先执行程序员通过API的方式注入的BeanDefinitionRegistryPostProcessor实现类
	1.2 再执行spring内置的ConfigurationClassPostProcessor对应的postProcessorBeanDefinitionRegistry方法
	1.3 执行程序员通过@Component注解方式注入的BeanDefinitionRegistryPostProcessor的实现类
		1.3.1 实现了PriorityOrdered接口的实现类先执行
		1.3.2 其次是实现了Order接口的
		1.3.3 最后会通过一个while循环,处理所有普通的BeanDefinitionRegistryPostProcessor的实现类,直到beanDefinitionMap中不存在未处理的BeanDefinitionRegistryPostProcessor的实现类


2.其次执行BeanFactoryPostProcessor的实现类
	2.1 先执行spring内置的、通过注解注入的、通过API注入的,BeanDefinitionRegistryPostProcessor实现类中对应的postProcessorBeanFactory方法(因为一个实现类,实现BeanDefinitionRegistryPostProcessor的方法时,必然要实现BeanFactoryPostProcessor接口中的方法);在这里,spring把beanDefinitionRegistryPostProcessor的实现类中的postProcessorBeanFactory()放在了一起来执行
	2.2 再执行程序员通过API的方式注入的BeanFactoryPostProcessor实现类对应的postProcessorBeanFactory方法(需要注意这里和2.1的区别,举个例子:如果我自己声明了A类,实现了BeanDefinitionRegistryPostProcessor实现类;声明了B类,实现了BeanFactoryPostProcessor接口;那么:A类和B类中的postProcessorBeanFactory()方法都会被执行,只是A类中的方法是在2.1执行的,B类中的是在2.2或者2.3这里)
	2.3 执行程序员通过注解方式注入的BeanFactoryPostProcessor的实现类
		2.3.1 实现了PriorityOrdered接口的实现类先执行
		2.3.2 实现了Ordered接口的实现类先执行
		2.3.3 普通的BeanFactoryPostProcessor实现类最后执行

猜你喜欢

转载自blog.csdn.net/CPLASF_/article/details/107183200