我們看一下放置在下面的源碼:
@Target(ElementType.TYPE) //指定在何處寫入註釋的合法位置
@Retention(RetentionPolicy.RUNTIME) //RetentionPolicy這個枚舉類型的常量描述保留註釋的各種策略,它們與元註釋(@Retention)一起指定註釋要保留多長時間
@Documented //表明這個註釋是由 javadoc記錄的,在默認情況下也有類似的記錄工具。 如果一個類型聲明被註釋了文檔化,它的註釋成爲公共API的一部分。
@Inherited //它指明被註解的類會自動繼承
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class), //掃描器
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) }) //掃描器的過濾方式
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 {};
}
由此可知:
@SpringBootApplication 註解,其實主要是 @ComponentScan
, @EnableAutoConfiguration
, @SpringBootConfiguration
三個註解
一般我們在spring boot
項目中會使用@SpringBootApplication
註解,因爲它可以做到自動配置,組件類掃描和定義額外的配置類,也就是說一個註解可以達到三種效果,而這三種效果又相當於三個註解的作用,這三個等價註解分別是:
(1)@EnableAutoConfiguration
:自動裝配依賴
(2)@ComponentScan
:在應用程序所在的包上啓用@component 的掃描
(3)@Configuration
:允許在上下文中註冊額外的Bean
,或者引入額外的配置類
因此@SpringBootApplication
註解相當於@EnableAutoConfiguration
、@ComponentScan
、@Configuration
註解的綜合效果。