~~
springboot开启自动配置
~~
SpringBoot自动配置的核心注解是@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 {
其中@SpringBootConfiguration也是一个复合注解我们进去可以发现这个注解中有@Configuration这个注解,说明我们的启动类也是一个配置类,也可以管理bean,不过为了规范一般不这样写。
@EnableAutoConfiguration也是一个复合注解,表示开启自动配置
@Target({
ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import({
AutoConfigurationImportSelector.class})
其中的@AutoConfigurationPackage下有个@Import({Registrar.class}),其中 Registrar 类的作用是将启动类所在包下的所有子包的组件扫描注入到spring容器中。这也是为什么我们的启动类都是和controller、service、dao等包同级的原因
@Import({AutoConfigurationImportSelector.class})其中AutoConfigurationImportSelector类中有个getCandidateConfigurations方法,该方法通过SpringFactoriesLoader.loadFactoryNames查找位于META-INF/spring.factories文件中的所有自动配置类,并加载这些类。
protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
List<String> configurations