SpringBoot?Application核心注解詳解
@SpringBootApplication
@SpringBootApplication 是一個“三體”結(jié)構(gòu),實際上它是一個復(fù)合 Annotation:
?
@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}
)}
)雖然它的定義使用了多個 Annotation 進(jìn)行元信息標(biāo)注,但實際上對于 SpringBoot 應(yīng)用來說,重要的只有三個 Annotation,而“三體”結(jié)構(gòu)實際上指的就是這三個 Annotation:
- @SpringBootConfiguration
- @EnableAutoConfiguration
- @ComponentScan
所以,如果我們使用如下的 SpringBoot 啟動類,整個 SpringBoot 應(yīng)用依然可以與之前的啟動類功能對等:
//@SpringBootApplication
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan
public class SpringbootDemoApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootDemoApplication.class, args);
}
}但每次都寫三個 Annotation 顯然過于繁瑣,所以寫一個 @SpringBootApplication 這樣的一站式復(fù)合 Annotation 顯然更方便些。
@SpringBootConfiguration
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
@Indexed
public @interface SpringBootConfiguration {
@AliasFor(
annotation = Configuration.class
)
boolean proxyBeanMethods() default true;
}這里的 @Configuration 對我們來說并不陌生,它就是 JavaConfig 形式的 Spring IoC 容器的配置類使用的那個 @Configuration,既然 SpringBoot 應(yīng)用骨子里就是一個 Spring 應(yīng)用,那么,自然也需要加載某個 IoC 容器的配置,而 SpringBoot 社區(qū)推薦使用基于 JavaConfig 的配置形式,所以,很明顯,這里的啟動類標(biāo)注了 @SpringBootConfiguration 之后,本身其實也是一個 IoC 容器的配置類!很多 SpringBoot 的代碼示例都喜歡在啟動類上直接標(biāo)注 @SpringBootConfiguration或者 @SpringBootApplication,對于初接觸 SpringBoot 的開發(fā)者來說,其實這種做法不便于理解,如果我們將上面的 SpringBoot 啟動類拆分為兩個獨(dú)立的 Java 類,整個形勢就明朗了:
// 配置類
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan
public class SpringbootDemoConfiguration {
public SpringbootDemoConfiguration(){}
}//運(yùn)行類
public class SpringbootDemoApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootDemoConfiguration.class, args);
}
}
所以,啟動類 SpringbootDemoApplication其實就是一個標(biāo)準(zhǔn)的 Standalone(單獨(dú)) 類型 Java 程序的 main 函數(shù)啟動類,沒有什么特殊的。而 @SpringBootConfiguration標(biāo)注的 SpringbootDemoConfiguration 定義其實也是一個普通的 JavaConfig 形式的 IoC 容器配置類。
@EnableAutoConfiguration
是借助 @Import 的幫助,將所有符合自動配置條件的 bean 定義加載到 IoC 容器,僅此而已!
@EnableAutoConfiguration 作為一個復(fù)合 Annotation,其自身定義關(guān)鍵信息如下:
@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 {};
}其中,最關(guān)鍵的要屬 @Import(AutoConfigurationImportSelector.class}),借助 AutoConfigurationImportSelector,@EnableAutoConfiguration 可以幫助 SpringBoot 應(yīng)用將所有符合條件的 @SpringBootConfiguration配置都加載到當(dāng)前 SpringBoot 創(chuàng)建并使用的 IoC 容器.
借助于 Spring 框架原有的一個工具類:SpringFactoriesLoader 的支持,@EnableAutoConfiguration 可以“智能”地自動配置功效才得以大功告成
@ComponentScan
@ComponentScan 是可有可無的
因為原則上來說,作為 Spring 框架里的“老一輩”,@ComponentScan 的功能其實就是自動掃描并加載符合條件的組件或 bean 定義,最終將這些 bean 定義加載到容器中。加載 bean 定義到 Spring 的 IoC 容器,我們可以手工單個注冊,不一定非要通過批量的自動掃描完成,所以說 @ComponentScan 是可有可無的。
對于 SpringBoot 應(yīng)用來說,同樣如此,比如啟動類:
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan
public class SpringbootDemoApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootDemoApplication.class, args);
}
}如果我們當(dāng)前應(yīng)用沒有任何 bean 定義需要通過 @ComponentScan 加載到當(dāng)前 SpringBoot 應(yīng)用對應(yīng)使用的 IoC 容器,那么,除去 @ComponentScan 的聲明,當(dāng)前 SpringBoot 應(yīng)用依然可以照常運(yùn)行,功能對等
到此這篇關(guān)于SpringBoot Application的文章就介紹到這了,更多相關(guān)SpringBoot Application內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java substring(a)與substring(a,b)的使用說明
這篇文章主要介紹了java substring(a)與substring(a,b)的使用說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-10-10
SpringBoot整合Ip2region獲取IP地址和定位的詳細(xì)過程
ip2region v2.0 - 是一個離線IP地址定位庫和IP定位數(shù)據(jù)管理框架,10微秒級別的查詢效率,提供了眾多主流編程語言的 xdb 數(shù)據(jù)生成和查詢客戶端實現(xiàn) ,這篇文章主要介紹了SpringBoot整合Ip2region獲取IP地址和定位,需要的朋友可以參考下2023-06-06
Java SSH 秘鑰連接mysql數(shù)據(jù)庫的方法
這篇文章主要介紹了Java SSH 秘鑰連接mysql數(shù)據(jù)庫的方法,包括引入依賴的代碼和出現(xiàn)異常報錯問題,需要的朋友可以參考下2021-06-06
Servlet實現(xiàn)統(tǒng)計頁面訪問次數(shù)功能
這篇文章主要介紹了Servlet實現(xiàn)統(tǒng)計頁面訪問次數(shù)功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-04-04

