ConfigurationClassPostProcessor是如何解析(@Bean,@Import等)装配bean的注解,并完成beanDefition注册的
LD is tigger forever,CG are not brothers forever, throw the pot and shine forever.
Modesty is not false, solid is not naive, treacherous but not deceitful, stay with good people, and stay away from poor people.
talk is cheap, show others the code,Keep progress,make a better result.
Survive during the day and develop at night。
目录
概述
问题
(1) @Configuration注解的作用是什么,Spring是如何解析加了@Configuration注解的类?
(2) Spring在什么时候对@ComponentScan、@ComponentScans注解进行了解析?
3) Spring什么时候解析了@Import注解,如何解析的?
(4) Spring什么时候解析了@Bean注解?
其实上面的四个问题都可以用一个类来解释,
ConfigurationClassPostProcessor。那么这个类究竟是如何来解决这些问题的呢?
ConfigurationClassPostProcessor是一个BeanFactory的后置处理器,因此它的主要功能是参与BeanFactory的建造,在这个类中,会解析加了@Configuration的配置类,还会解析@ComponentScan、@ComponentScans注解扫描的包,以及解析@Import等注解。
ConfigurationClassPostProcessor这个类是Spring内置的一个BeanFactory后置处理器,是在this()方法中将其添加到BeanDefinitionMap中的(可以参考笔者的另一篇文章 https://mp.weixin.qq.com/s/q6zs7xRjpcB4YxLw6w477w )。在执行过程中,会先执行postProcessBeanDefinitionRegistry(),然后执行postProcessBeanFactory()。
postProcessBeanDefinitionRegistry
postProcessBeanDefinitionRegistry()方法中调用了processConfigBeanDefinitions(),所以核心逻辑在processConfigBeanDefinition()方法中。
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry){
processConfigBeanDefinitions(registry);
}
processConfigBeanDefinitions()方法代码如下(省略了部分不重要的代码),源码中添加了许多注释,解释了部分重要方法的作用。
ConfigurationClassUtils.checkConfigurationClassCandidate()
该方法是用来判断一个是否是一个配置类,并为BeanDefinition设置属性为lite或者full。如果加了@Configuration,那么对应的BeanDefinition为full,如果加了@Bean,@Component,@ComponentScan,@Import,@ImportResource这些注解,则为lite。lite和full均表示这个BeanDefinition对应的类是一个配置类。
isFullConfigurationCandidate()方法用来判断一个类是否加了@Configuration注解
isLiteConfigurationCandidate()方法用来判断类是否加了@Bean,@Component,@ComponentScan,@Import,@ImportResource注解
2.2 parser.pase()
实现思路分析
相关工具如下:
分析:
小结:
主要讲述了注解配置方式的Spring 是如何解析@Configuration、@Bean以及@Component, 里面有许多不足,请大家指正~