Spring boot核心功能即为自动配置,Spring与Spring boot之间区别也在于此,遵循“约定大于配置”的原则,下面来探讨Spring boot自动配置是如何实现的呢?
以下为自动配置的简略流程图:
上图通过一句话即可描述:Spring boot通过@EnableAutoConfiguration注解开启自动配置,加载spring.factories中的注册的各种AutoConfiguration,当某个AutoConfiguration类满足@Conditional指定的生效条件(starters提供的依赖、配置或Spring容器中是否存在某Bean等)时,实例化该AutoConfiguration类中定义的Bean(组件等),并注入Spring容器,就可以完成依赖框架的自动配置。
@EnableAutoConfiguration
该注解由组合注解@SpringBootApplication引入,完成自动配置开启,扫描各个jar包下的spring.factories文件,并加载文件中注册的AutoConfiguration等。spring.factories
配置文件,位于jar包的META-INF目录下,按照指定格式注册了自动配置的AutoConfiguration类。spring.factories也可以包含其他类型待注册的类。该配置文件不仅存在于Spring boot项目中,也可以存在于自定义的自动配置(或starter)项目中。AutoConfiguration类
为自动配置类,代表了Spring boot中一类以xxAutoConfiguration命名的自动配置类。其中定义了三方组件集成的Spring所需初始化的Bean和条件。@Conditional
条件注解及其衍生注解,在AutoConfiguration类上使用,当满足该条件注解时才会实例化AutoConfiguration类。starters
三方组件的依赖及配置,Spring boot已经预置的组件。Spring boot默认的starters项目往往只包含了一个pom依赖的项目。
源码分析
@EnableAutoConfiguration
该注解在项目中一般不能被找到,其被组合到@SpringBootApplication
注解中,组成该注解的为@SpringBootConfiguration
、@EnableAutoConfiguration
、@ComponentScan
,也就是说Springboot项目中可以使用这三个注解取代@SpringBootApplication
。以下为分析源码:
@Target({
ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited