SpringBoot中@EnableAutoConfiguration注解源码分析
作者:cloneme01
工作原理
SpringBoot通过@EnableAutoConfiguration注解开启自动配置,加载spring.factories文件中注册的各种AutoConfiguration
当某个AutoConfiguration类满足@Conditional指定的生效条件时,实例化该AutoConfiguration类中定义的Bean,注入到Spring容器中,就可以完成依赖框架的自动配置。
- 需要和@Configuration配合使用;
- 用于实例化依赖包中的对象;
- 一般需要在META-INF/spring.factories中进行配置;
- 经常用于自定义的starter中。
应用场景
@EnableAutoConfiguration,主要是用于加载Starter目录包之外的、需要Spring自动生成Bean对象的、带有@Configuration注解的类。
一般用于对各种引入的spring-boot-starter依赖包指定的(spring.factories)类进行实例化。
源码分析
@EnableAutoConfiguration是被组合到@SpringBootApplication注解中被引入的。
@SpringBootApplication包含三个重要的注解,分别为:
- @SpringBootConfiguration
- @EnableAutoConfiguration
- @ComponentScan
从下面的源码可以知道,@EnableAutoConfiguration是由@AutoConfigurationPackage 和 @Import({AutoConfigurationImportSelector.class})这两个注解组成的。
- @SpringBootApplication = @SpringBootConfiguration + @EnableAutoConfiguration + @ComponentScan
- @EnableAutoConfiguration = @AutoConfigurationPackage + @Import({AutoConfigurationImportSelector.class})
@Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @SpringBootConfiguration @EnableAutoConfiguration @ComponentScan( excludeFilters = {@Filter( type = FilterType.CUSTOM, classes = {TypeExcludeFilter.class} ), @Filter( type = FilterType.CUSTOM, classes = {AutoConfigurationExcludeFilter.class} )} ) public @interface SpringBootApplication { @AliasFor( annotation = EnableAutoConfiguration.class ) Class<?>[] exclude() default {}; @AliasFor( annotation = EnableAutoConfiguration.class ) String[] excludeName() default {}; @AliasFor( annotation = ComponentScan.class, attribute = "basePackages" ) String[] scanBasePackages() default {}; @AliasFor( annotation = ComponentScan.class, attribute = "basePackageClasses" ) Class<?>[] scanBasePackageClasses() default {}; @AliasFor( annotation = ComponentScan.class, attribute = "nameGenerator" ) Class<? extends BeanNameGenerator> nameGenerator() default BeanNameGenerator.class; @AliasFor( annotation = Configuration.class ) boolean proxyBeanMethods() default true; }
总结
@EnableAutoConfiguration是一个组合注解,该注解内部使用@Import注解,引入了配置类AutoConfigurationImportSelector.Class
该类是ImportSelect接口的实现类,它重写了接口中的selectImports()方法,得到一个String类型的数组。
该数组是通过底层加载配置文件 META-INF/spring.factories得到的,该配置文件中定义了大量的配置类,Sringboot 启动的时候会加载所有的selector并执行selectImports方法,从而完成自动配置。
不是所有的类在初始化时都可以自动加载进SpringIOC容器中,要结合@Conditional这个条件注解进行判断,待加载的配置类如果满足所有的@Conditional注解限定的条件,才会进行自动加载。
到此这篇关于SpringBoot中@EnableAutoConfiguration注解源码分析的文章就介绍到这了,更多相关@EnableAutoConfiguration注解源码内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!