想要了解spring boot 的自动装配,就需要了解一个注解
@SpringBootApplication
它是一个组合注解
@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 {}
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@documented
@Inherited
这四个注解是java 元注解,重点看下面三个注解
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@documented
@Configuration
@Indexed
public @interface SpringBootConfiguration {
@AliasFor(annotation = Configuration.class)
boolean proxyBeanMethods() default true;
}
包含@Configuration 说明这就是配置类,所以重点不在这里
@ComponentScan()指定扫描的路径,spring 注解,重点也不在这里
@EnableAutoConfiguration最核心的功能就在这个注解上
@AutoConfigurationPackage
@import(AutoConfigurationimportSelector.class)
public @interface EnableAutoConfiguration {
String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";
Class>[] exclude() default {};
String[] excludeName() default {};
}
这个里面包含两个注解
@AutoConfigurationPackage直接翻译过来,是自动配置包
@import(AutoConfigurationPackages.Registrar.class)
public @interface AutoConfigurationPackage {
String[] basePackages() default {};
Class>[] basePackageClasses() default {};
}
还是包含了一个@import(AutoConfigurationPackages.Registrar.class)
利用Registrar给容器中导入一系列组件,导入的也就是Application 所在包下
自动配置包,也引用到了@import 注解,@import注解的作用:导入配置类或者一些需要前置加载的类.
具体
1、利用getAutoConfigurationEntry(annotationmetadata);给容器中批量导入一些组件
2、调用List configurations = getCandidateConfigurations(annotationmetadata, attributes)获取到所有需要导入到容器中的配置类
3、利用工厂加载 Map
4、从meta-INF/spring.factories位置来加载一个文件。
默认扫描我们当前系统里面所有meta-INF/spring.factories位置的文件
spring-boot-autoconfigure-2.5.2.jar包中的meta-INF/spring.factories
实际上就是meta-INF/spring.factories 下面的
org.springframework.boot.autoconfigure.EnableAutoConfiguration=



