Spring注解解析之ConfigurationClassPostProcessor

ConfigurationClassPostProcessor会处理所有BeanDefinition中的符合注解条件的BeanDefinition,(@Configuration注解的、@Component、@ComponentScan、@Import、@ImportResource或者@Bean注解的),使用ConfigurationClassParser解析出javaconfig配置类,使用ConfigurationClassBeanDefinitionReader加载。

先来提个问题:

相信很多同学出去面试,都会被问到一个问题:

请说一下spring boot的自动装配原理?

相信大部分同学是这样回答的:

1 首先找到spring boot启动类:找到注解SpringBootApplication

 

2 点注解进去找到:这三个注解:

@SpringBootConfiguration

@EnableAutoConfiguration

@ComponentScan

3 最关键是看注解:@EnableAutoConfiguration,继续点注解进去,找到

4 点Import导入的AutoConfigurationImportSelector.class,继续进去

5 找到方法:getCandidateConfigurations,点击里面的方法:getSpringFactoriesLoaderFactoryClass

6 找到EnableAutoConfiguration.class类

7 找到如下图:可以看到通过EnableAutoConfiguration类自动导入了spring boot所有需要的类

 

如果是这样回答的,也不能完全算错误,只是一上来就说通过找注解这样找到的,实在有点勉强,下面我们来分析ConfigurationClassPostProcessor后置处理器的处理,来揭开这个原理。

1 先找到启动类,进入run方法

2 一直找到refreshContext方法

3 继续找到refresh方法,进入到invokeBeanFactoryPostProcessors方法

4 进入到了类:ConfigurationClassPostProcessor 的方法postProcessBeanDefinitionRegistry

走到解析的方法parse

 

 

5 进入到getImports方法

6 到这里就可以看到引入解析出来的

 

7 再具体来看import注解的解析

8 来看process方法

进入方法getImport

再进入process方法

终于进入到了关键

终于到了方法:getCandidateConfigurations

先来看方法getSpringFactoriesLoaderFactoryClass

获取到了自动装配类:EnableAutoConfiguration

 

继续加载

到这个目录加载:META-INF/spring.factories

最后加载到了自动装配类下面所有的类

最终的效果是不是一模一样

 

下面我们具体来看下:ConfigurationClassPostProcessor解析

先在xml中打开扫描配置:

 

在类中添加一个注解:

测试类:

1 进入到:

 

 

先进入到ConfigurationClassPostProcessor类的postProcessBeanDefinitionRegistry方法,因为ConfigurationClassPostProcessor实现了接口:BeanDefinitionRegistryPostProcessor

BeanDefinitionRegistryPostProcessor接口:

继续执行:

检查是否候选者:

再到解析方法

 

 

终于进入到了方法 doProcessConfigurationClass,真正解析@Component、@PropertySources、@ComponentScan、@ImportResource、@Import、@Bean注解的

后续在spring boot的时候,再详细聊这一块

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值