1. 加载方式
SpringApplicationContext的启动过程主要分为几个步骤
- 加载BeanDefinition
- 注册BeanPostProcessor
- 实例化Bean
- 调用BeanPostProcessor
对于Application内定义的BeanDefinition我们可以通过ComponentScan设置扫描路径进行自动扫描。但是对于自动配置类一般不在ComponentScan的扫描路径内,那自动配置类是何时以及如何被加载的呢?
我们知道对于通过注解启动的Application,BeanDefiniton的加载过程主要由BeanFactoryPostProcessor来实现,其核心类是ConfigurationClassPostProcessor,而ConfigurationClassPostProcessor支持两种Bean Import方法,一种是基于ImportSelector,另一种是基于ImportBeanDefinitionRegistrar。
那么自动配置类的加载就是通过ImportSelector方式实现的,要想Application支持自动配置需要添加@EnableAutoConfiguration注解。
该注解的定义如下:
可以看到该注解Import了AutoConfigurationImportSelector类,该类正式ImportSelector的实现类。
正常我们在SpringBoot Application的启动类上会添加 @SpringBootApplication注解,这个注解本身就自带@EnableAutoConfiguration注解,所以正常我们只需要在应用启动类上添加@SpringBootApplication注解即可。
SpringBootApplication注解功能强大啊!
2. 加载时机
还记得ConfigurationClassPostProcessor是如何处理各注解的加载顺序的吗?
详情可参考2.2 各注解加载顺序
加载顺序:
如果是Component组件,处理类成员
处理@PropertySource注解
处理@ComponentScan注解
处理@Import注解
处理@ImportResource注解
处理@Bean方法
处理接口的默认方法
处理父类(如果有的话)