// 元注解 @Target:注解的作用目标
//ElementType.TYPE:接口、类、枚举、注解
@Target({ElementType.TYPE})
//元注解 @Retention 注解作用目标的生命周期
//RetentionPolicy.RUNTIME:注解不仅被保存到class文件中,jvm加载class文件之后,仍然存在;
@Retention(RetentionPolicy.RUNTIME)
//元注解 @Documented 注解表明这个注解应该被 javadoc工具记录. 默认情况下,javadoc是不包括注解的.
//但如果声明注解时指定了 @Documented,则它会被 javadoc 之类的工具处理,
//所以注解类型信息也会被包括在生成的文档中,是一个标记注解,没有成员。
@Documented
// @Inherited是一个标识,用来修饰注解
//作用:如果一个类用上了@Inherited修饰的注解,那么其子类也会继承这个注解
@Inherited
//@SpringBootConfiguration继承自@Configuration,二者功能也一致,标注当前类是配置类,
//并会将当前类内声明的一个或多个以@Bean注解标记的方法的实例纳入到spring容器中,并且实例名就是方法名。
@SpringBootConfiguration
//@EnableAutoConfiguration 自动载入应用程序所需的所有Bean——这依赖于Spring Boot在类路径中的查找。
@EnableAutoConfiguration
//该注解默认会扫描该类所在的包下所有的配置类,相当于之前的 <context:component-scan>。
@ComponentScan(
excludeFilters = {@Filter(
type = FilterType.CUSTOM,
classes = {TypeExcludeFilter.class}
), @Filter(
type = FilterType.CUSTOM,
classes = {AutoConfigurationExcludeFilter.class}
)}
)
//在SpringBoot2.2之后,如果想让一个仅有@ConfigurationProperties注解的配置类被注册为bean,
//可以通过@ConfigurationPropertiesScan注解开启。则不再需要配合@Component一起使用
@ConfigurationPropertiesScan
public @interface SpringBootApplication {
@AliasFor(
annotation = EnableAutoConfiguration.class
)
Class<?>[] exclude() default {};
@AliasFor(
annotation = EnableAutoConfiguration.class
)
String[] excludeName() default {};
@AliasFor(
annotation = ComponentScan.class,
attribute = "basePackages"
)
String[] scanBasePackages() default {};
@AliasFor(
annotation = ComponentScan.class,
attribute = "basePackageClasses"
)
Class<?>[] scanBasePackageClasses() default {};
@AliasFor(
annotation = Configuration.class
)
boolean proxyBeanMethods() default true;
}