SpringBoot?Application核心注解詳解
@SpringBootApplication
@SpringBootApplication 是一個(gè)“三體”結(jié)構(gòu),實(shí)際上它是一個(gè)復(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}
)}
)雖然它的定義使用了多個(gè) Annotation 進(jìn)行元信息標(biāo)注,但實(shí)際上對(duì)于 SpringBoot 應(yīng)用來(lái)說(shuō),重要的只有三個(gè) Annotation,而“三體”結(jié)構(gòu)實(shí)際上指的就是這三個(gè) Annotation:
- @SpringBootConfiguration
- @EnableAutoConfiguration
- @ComponentScan
所以,如果我們使用如下的 SpringBoot 啟動(dòng)類(lèi),整個(gè) SpringBoot 應(yīng)用依然可以與之前的啟動(dòng)類(lèi)功能對(duì)等:
//@SpringBootApplication
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan
public class SpringbootDemoApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootDemoApplication.class, args);
}
}但每次都寫(xiě)三個(gè) Annotation 顯然過(guò)于繁瑣,所以寫(xiě)一個(gè) @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 對(duì)我們來(lái)說(shuō)并不陌生,它就是 JavaConfig 形式的 Spring IoC 容器的配置類(lèi)使用的那個(gè) @Configuration,既然 SpringBoot 應(yīng)用骨子里就是一個(gè) Spring 應(yīng)用,那么,自然也需要加載某個(gè) IoC 容器的配置,而 SpringBoot 社區(qū)推薦使用基于 JavaConfig 的配置形式,所以,很明顯,這里的啟動(dòng)類(lèi)標(biāo)注了 @SpringBootConfiguration 之后,本身其實(shí)也是一個(gè) IoC 容器的配置類(lèi)!很多 SpringBoot 的代碼示例都喜歡在啟動(dòng)類(lèi)上直接標(biāo)注 @SpringBootConfiguration或者 @SpringBootApplication,對(duì)于初接觸 SpringBoot 的開(kāi)發(fā)者來(lái)說(shuō),其實(shí)這種做法不便于理解,如果我們將上面的 SpringBoot 啟動(dòng)類(lèi)拆分為兩個(gè)獨(dú)立的 Java 類(lèi),整個(gè)形勢(shì)就明朗了:
// 配置類(lèi)
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan
public class SpringbootDemoConfiguration {
public SpringbootDemoConfiguration(){}
}//運(yùn)行類(lèi)
public class SpringbootDemoApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootDemoConfiguration.class, args);
}
}
所以,啟動(dòng)類(lèi) SpringbootDemoApplication其實(shí)就是一個(gè)標(biāo)準(zhǔn)的 Standalone(單獨(dú)) 類(lèi)型 Java 程序的 main 函數(shù)啟動(dòng)類(lèi),沒(méi)有什么特殊的。而 @SpringBootConfiguration標(biāo)注的 SpringbootDemoConfiguration 定義其實(shí)也是一個(gè)普通的 JavaConfig 形式的 IoC 容器配置類(lèi)。
@EnableAutoConfiguration
是借助 @Import 的幫助,將所有符合自動(dòng)配置條件的 bean 定義加載到 IoC 容器,僅此而已!
@EnableAutoConfiguration 作為一個(gè)復(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 框架原有的一個(gè)工具類(lèi):SpringFactoriesLoader 的支持,@EnableAutoConfiguration 可以“智能”地自動(dòng)配置功效才得以大功告成
@ComponentScan
@ComponentScan 是可有可無(wú)的
因?yàn)樵瓌t上來(lái)說(shuō),作為 Spring 框架里的“老一輩”,@ComponentScan 的功能其實(shí)就是自動(dòng)掃描并加載符合條件的組件或 bean 定義,最終將這些 bean 定義加載到容器中。加載 bean 定義到 Spring 的 IoC 容器,我們可以手工單個(gè)注冊(cè),不一定非要通過(guò)批量的自動(dòng)掃描完成,所以說(shuō) @ComponentScan 是可有可無(wú)的。
對(duì)于 SpringBoot 應(yīng)用來(lái)說(shuō),同樣如此,比如啟動(dòng)類(lèi):
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan
public class SpringbootDemoApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootDemoApplication.class, args);
}
}如果我們當(dāng)前應(yīng)用沒(méi)有任何 bean 定義需要通過(guò) @ComponentScan 加載到當(dāng)前 SpringBoot 應(yīng)用對(duì)應(yīng)使用的 IoC 容器,那么,除去 @ComponentScan 的聲明,當(dāng)前 SpringBoot 應(yīng)用依然可以照常運(yùn)行,功能對(duì)等
到此這篇關(guān)于SpringBoot Application的文章就介紹到這了,更多相關(guān)SpringBoot Application內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringMVC注解@RequestParam方法原理解析
這篇文章主要介紹了SpringMVC注解@RequestParam方法原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04
spring?security需求分析與基礎(chǔ)環(huán)境準(zhǔn)備教程
這篇文章主要為大家介紹了spring?security需求分析與基礎(chǔ)環(huán)境準(zhǔn)備教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-03-03
解析Java中未被捕獲的異常以及try語(yǔ)句的嵌套使用
這篇文章主要介紹了Java中未被捕獲的異常以及try語(yǔ)句的嵌套使用,是Java入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-09-09
SpringBoot整合WebSocket實(shí)現(xiàn)實(shí)時(shí)通信功能
在當(dāng)今互聯(lián)網(wǎng)時(shí)代,實(shí)時(shí)通信已經(jīng)成為了許多應(yīng)用程序的基本需求,而WebSocket作為一種全雙工通信協(xié)議,為開(kāi)發(fā)者提供了一種簡(jiǎn)單、高效的實(shí)時(shí)通信解決方案,本文將介紹如何使用SpringBoot框架來(lái)實(shí)現(xiàn)WebSocket的集成,快速搭建實(shí)時(shí)通信功能,感興趣的朋友可以參考下2023-11-11
java語(yǔ)言描述Redis分布式鎖的正確實(shí)現(xiàn)方式
這篇文章主要介紹了java語(yǔ)言描述Redis分布式鎖的正確實(shí)現(xiàn)方式,具有一定借鑒價(jià)值,需要的朋友可以參考下。2017-12-12
mybatis generator 配置 反向生成Entity簡(jiǎn)單增刪改查(推薦)
這篇文章主要介紹了mybatis generator 配置 反向生成Entity簡(jiǎn)單增刪改查(推薦)的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-12-12
聊聊Object類(lèi)中的wait()和notify()方法
這篇文章主要介紹了Object類(lèi)中的wait()和notify()方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09

