作用
大家都知道在创建一个新的SpringBoot项目的启动类上会有@SpringBootApplication注解存在,该注解是为了标明这个类是项目的主配置类和启动类。
@SpringBootApplication
public class SpringBootApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootApplication.class, args);
}
}
那么这个注解起到了什么作用呢,我门通过查看源码可以发现,它是由三个注解(@SpringBootConfiguration @EnableAutoConfiguration @ComponentScan)合成的聚合型注解。
@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
通过源码可以看出其实就是SpringBoot框架把@Configuration来做了一个封装。主要是用来代替applicationContext.xml配置文件的。
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
@Indexed
public @interface SpringBootConfiguration {
@AliasFor(
annotation = Configuration.class
)
boolean proxyBeanMethods() default true;
}
@EnableAutoConfiguration
通过字面意思我们可以看出,它是一个开始自动配置功能的注解,主要作用是让Spring自动去进行一些配置。
@AutoConfigurationPackage
作用:把包和子包的类扫描到Spring容器中
@Import(EnableAutoConfigurationImportSelector.class)
作用:从指定的配置文件META-INF/spring.factories加载配置并添加到容器当中
@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 {};
}
@ComponentScan
主要作用是用来标志注解扫描,根据定义的扫描路径,把符合扫描规则的类装配到Srping容器当中。
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
@Documented
@Repeatable(ComponentScans.class)
public @interface ComponentScan {
}