SpringBoot通过@EnableAutoConfiguration注解开启自动配置
SpringBoot的标准启动入口如下:
@SpringBootApplication
public class GraduationProjectApplication {
public static void main(String[] args) {
SpringApplication.run(GraduationProjectApplication.class, args);
}
}
通过标准启动入口的代码可以看出,Springboot启动类的核心注解是@SpringBootApplication。
@SpringBootApplication源码:
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
/**
* 继承自@Configuration
* 标注在类上表示这是一个SpringBoot的配置类,允许在上下文中注册额外的bean或者导入其他配置项
**/
@SpringBootConfiguration
/**
* 开启自动配置功能
* 主要包含两个注解:@AutoConfigurationPackage、@Import
**/
@EnableAutoConfiguration
/**
* 自动扫描并加载符合条件的组件或者bean , 将这个bean定义加载到IOC容器中
**/
@ComponentScan(
excludeFilters = {@Filter(
type = FilterType.CUSTOM,
classes = {TypeExcludeFilter.class}
), @Filter(
type = FilterType.CUSTOM,
classes = {AutoConfigurationExcludeFilter.class}
)}
)
自动配置具体实现步骤:
1、SpringBoot启动的时候加载主启动类,通过@EnableAutoConfiguration开启自动配置功能。
2、@EnableAutoConfiguration利用AutoConfigurationImportSelector给容器中导入一些组件。
3、通过protected List getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes)获取候选的配置和核心方法,扫描所有jar包类路径下"META-INF/spring.factories",通过@AutoConfigurationPackage自动配置包。
4、把扫描到的文件包装成Properties对象。
5、从properties中获取到EnableAutoConfiguration.class类名对应的值,并把他们添加在容器中。
6、整个过程就是将类路径下"META-INF/spring.factories"里面配置的所有EnableAutoConfiguration的值加入到容器中。
7、根据@Conditional注解中的条件判断,决定这个配置是否生效。
8、初始化Bean,自动配置完成。
总结
SpringBoot通过@EnableAutoConfiguration开启自动配置,通过 SpringFactoriesLoader 最终加载META-INF/spring.factories中的自动配置类实现自动装配,自动配置类其实就是通过@Conditional按需加载的配置类。