1. 程式人生 > >Spring Boot @Enable*註解原始碼解析及自定義@Enable*

Spring Boot @Enable*註解原始碼解析及自定義@Enable*

  Spring Boot 一個重要的特點就是自動配置,約定大於配置,幾乎所有元件使用其本身約定好的預設配置就可以使用,大大減輕配置的麻煩。其實現自動配置一個方式就是使用@Enable*註解,見其名知其意也,即“使什麼可用或開啟什麼的支援”。 ### Spring Boot 常用@Enable* 首先來簡單介紹一下Spring Boot 常用的@Enable*註解及其作用吧。 1. `@EnableAutoConfiguration` 開啟自動掃描裝配Bean,組合成@SpringBootApplication註解之一

2. `@EnableScheduling` 開啟計劃任務的支援

3. `@EnableTransactionManagement` 開啟註解式事務的支援。

4. `@EnableCaching` 開啟註解式的快取支援。

5. `@EnableAspectJAutoProxy` 開啟對AspectJ自動代理的支援。

6. `@EnableEurekaServer` 開啟Euraka Service 的支援,開啟spring cloud的服務註冊與發現

7. `@EnableDiscoveryClient` 開啟服務提供者或消費者,客戶端的支援,用來註冊服務或連線到如Eureka之類的註冊中心

8. `@EnableFeignClients` 開啟[Feign](https://segmentfault.com/a/1190000011675354)功能

還有一些不常用的比如:
0. `@EnableAsync` 開啟非同步方法的支援

10. `@EnableWebMvc` 開啟Web MVC的配置支援。

11. `@EnableConfigurationProperties` 開啟對@ConfigurationProperties註解配置Bean的支援。

12. `@EnableJpaRepositories` 開啟對Spring Data JPA Repository的支援。

參考:http://tangxiaolin.com/learn/show?id=402881d2648c88cc01648c89d8730001 ### @Enable*的原始碼解析 #### 檢視它們的原始碼 @EnableAutoConfiguration ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20190214154013463.PNG) @EnableCaching 開啟註解式的快取支援。 ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20190214154113111.PNG) @EnableDiscoveryClient(@EnableEurekaServer 也是使用了這個組合註解) 開啟服務提供者或消費者,客戶端的支援,用來註冊服務或連線到如Eureka之類的註冊中心 ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20190214154152136.PNG) @EnableAspectJAutoProxy 開啟對AspectJ自動代理的支援。 ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20190214154124740.PNG) @EnableFeignClients 開啟Feign功能 ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20190214154202827.PNG) @EnableScheduling(這個比較**特殊**,為自己直接新建相關類,不繼承***Selector和***Registrar) 開啟計劃任務的支援 ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20190214154042196.PNG) #### 原始碼規律及解析 可以發現它們都使用了@Import註解(其中@Target:註解的作用目標,@Retention:註解的保留位置,@Inherited:說明子類可以繼承父類中的該註解,@Document:說明該註解將被包含在javadoc中) 該元註解是被用來整合所有在@Configuration註解中定義的bean配置,即相當於我們將多個XML配置檔案匯入到單個檔案的情形。 而它們所引入的配置類,主要分為***Selector和***Registrar,其分別實現了`ImportSelector`和`ImportBeanDefinitionRegistrar`介面, ![ImportSelector介面原始碼](https://img-blog.csdnimg.cn/2019021416233925.PNG) ![ImportBeanDefinitionRegistrar介面原始碼](https://img-blog.csdnimg.cn/20190214162414379.PNG) 兩個的大概意思都是說,會根據AnnotationMetadata元資料註冊bean類,即返回的Bean 會自動的被注入,被Spring所管理。 既然他們功能都相同,都是用來返回類,為什麼 Spring 有這**兩種不同的介面類**的呢? 其實剛開始的時候我也以為它們功能應該都是一樣的,後面我在組內分享的時候,我的導師就問了我這個問題,然後當時我沒有留意這個點所以答不出來