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,支持JavaConfig的方式进行配置。首先说明启动类是一个配置类,最终会被注入到spring容器中去;
@ComponentScan:自动扫描组件,默认扫描该类所在包及其子包下所有带有指定注解的类,将它们自动装配到bean容器中。
@EnableAutoConfiguration:用于开启自动配置。继续点进去查看,可以发现一下信息:
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {
String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";
Class<?>[] exclude() default {};
String[] excludeName() default {};
}
其中有两个比较重要的注解:
@AutoConfigurationPackage : 自动配置包;@AutoConfigurationPackage的作用是将主配置类(@SpringBootApplication标注的类)的所在包及下面所有的子包里面的所有组件扫描到Spring容器中。所以controller、service之类的包必须在和主启动类在同一包下。
@Import(AutoConfigurationPackages.Registrar.class)
Spring底层注解@import , 给容器中导入一个组件,导入的组件由AutoConfigurationPackages.Registrar.class这个类来指定。
总结:
Spring Boot在启动的时候从类路径下的META-INF/spring.factories中获取EnableAutoConfiguration指定的值将这些值作为自动配置类导入到容中,自动配置类就生效,帮我们进行自动配置工作;