spring-boot 自动加载的原理
概述:
spring-boot项目中,我们只要创建一个启动类并且标注@SpringBootApplication注解,就可以完成自动化的配置,这其中的原理,主要就是@SpringBootApplication注解的作用,下面我们详细分析下这个注解。
一、SpringBootApplication注解
@SpringBootApplication注解主要包装了三个子注解如下:
@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class))
public @interface SpringBootApplication {
其中@ComponentScan用来扫描包的作用,@SpringBootConfiguration是@Configuration的包装,@Configuration又是@Component的包装 表示这个类是一个配置类。
@EnableAutoConfiguration注解是我们主要分析的对象。
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(EnableAutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration
此注解主要起作用的有2个,一个是@AutoConfigurationPackage,一个是@Import(重点分析)
我们知道@Import除了加载指定class的类,还可以指定ImportSelector实现的子类,这个接口方法selectImports,返回的列表即是这个@Import注解需要加载的类。
EnableAutoConfigurationImportSelector的具体实现。
public String[] selectImports(AnnotationMetadata metadata) {
try {
AnnotationAttributes attributes = getAttributes(metadata);
List<String> configurations = getCandidateConfigurations(metadata,
attributes); // 加载候选的配置类
// ....略
return configurations.toArray(new String[configurations.size()]);
}
catch (IOException ex) {