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