Java使用@EnableEurekaServer實現(xiàn)自動裝配詳解
實踐
仿照@EnableEurekaServer實現(xiàn)自動裝配
如果你使用過Eureka作為微服務的注冊中心,那么對@EnableWebConfigure一定很了解,該注解用來開啟Eureka服務端作為微服務的注冊中心,其背后是springboot自動裝配原理。
本次,將仿照此設(shè)計思路,完成Web應用統(tǒng)一異常處理、TraceId鏈路日志追蹤、Json序列化消息處理器等通用能力的自動裝配。
@EnableEurekaServer
通過源碼我們得知,此注解的源碼如下
/** * Annotation to activate Eureka Server related configuration. * {@link EurekaServerAutoConfiguration} * * @author Dave Syer * @author Biju Kunjummen * */ @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Import(EurekaServerMarkerConfiguration.class) public @interface EnableEurekaServer { }
那么,如何通過在啟動類標識此注解即可實現(xiàn)EurekaServer的自動裝配呢?
答案其實在這一句
@Import(EurekaServerMarkerConfiguration.class)
該注解使用了@Import注解導入了一個配置類 EurekaServerMarkerConfiguration.java,該配置類源碼如下
@Configuration(proxyBeanMethods = false) public class EurekaServerMarkerConfiguration { @Bean public Marker eurekaServerMarkerBean() { return new Marker(); } class Marker { } }
我們看到,該配置類聲明了一個Bean 內(nèi)部類Marker
那么,為什么聲明這個類?這個類看起來沒有任何屬性和方法
我們在導入的EurekaServer包中繼續(xù)尋找答案
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency>
通過Command + 單擊 Marker類,我們看到了如下引用
@ConditionalOnBean(EurekaServerMarkerConfiguration.Marker.class)
可以發(fā)現(xiàn),一個條件裝配使用了這個類,該注解的含義是當上下文中有Marker實例時,進行注解所在配置類的裝配,也就是 EurekaServerAutoConfiguration
通過查看其源碼,可以看到大量的EurekaServer相關(guān)Bean聲明,也就是說,實現(xiàn)了EurekaServerAutoConfiguration的裝配,也就實現(xiàn)類EurekaServer的裝配
好的,思路清晰了 通過@EnableEurekaServer來導入EurekaServerMarkerConfiguration,進而將內(nèi)部類Marker實例化到spring上下文中,通過條件裝配,再來裝配EurekaServerAutoConfiguration配置文件
也就是說 內(nèi)部類Marker 起到了一個開關(guān)的作用
接下來只剩最后一個問題,我們只寫了一行代碼,也就是 @EnableEurekaServer 加到了springboot啟動類上,那么 EurekaServerAutoConfiguration 是怎樣被識別并導入到我們自己的項目中呢?
涉及到另一個知識點 spring.factories 它可以實現(xiàn),將我們編寫的jar包中的配置類,能夠被依賴方識別到。
關(guān)于這點請自行百度查閱前置知識,只要理解它的作用,代碼其實很簡單。關(guān)于這點多說一下,許久之前我曾經(jīng)有過疑惑,就是我編寫的Common包其中包含了使用spring注解@Component、@Service、@Controller等修飾的Bean,那么引入這個jar包的spring工程,如何能夠?qū)?/p>
這個Bean注入到spring上下文中呢,使用@ComponentScan掃描,顯然勉強能夠?qū)崿F(xiàn),但是如果所有引入的工程都去改寫@ComponentScan 顯然不現(xiàn)實,spring.factories就可以靈活的實現(xiàn)該需求,自動的將配置進行導入
@EnableWebConfigure
@EnableWebConfigure 是我自定義的注解,期望用它來自動開啟Web相關(guān)的公共能力,實現(xiàn)如下:
@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) @Documented @Import(WebMarkerConfiguration.class) public @interface EnableWebConfigure { }
注解標識在啟動類上即可,它并沒有屬性和方法,僅導入了另一個配置類 WebMarkerConfiguration.class
@Configuration public class WebMarkerConfiguration { @Bean public Marked createMarkedInstance(){ return new Marked(); } class Marked{ } }
可以看到,我很懶,連名字都跟EurekaServer中的實現(xiàn)一樣…
而引用此Marked標識的是配置類 InternalCommonBeanConfiguration
@Configuration @Import({WebConfig.class, WebMvcConfig.class}) @ConditionalOnBean(WebMarkerConfiguration.Marked.class) public class InternalCommonBeanConfiguration { @Bean public GlobalExceptionInterceptor createGlobalExceptionInterceptor(){ // 全局異常處理 return new GlobalExceptionInterceptor(); } @Bean public TransIdFilter createTransIdFilter(){ // TraceId 過濾器 return new TransIdFilter(); } }
類中除了聲明GlobalExceptionInterceptor以及TransIdFilter,還導入了@Import({WebConfig.class, WebMvcConfig.class})
這兩個類用來配合@ResponseBody或者@RestController實現(xiàn)JSON序列化
最后,通過在internal-common工程resource文件下,新建 META-INF/spring.factories 文件,來暴露InternalCommonBeanConfiguration,以方便其他項目能夠在依賴時,自動導入。
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.sun.online.internalcommon.configure.InternalCommonBeanConfiguration
具體工程中的應用請見 org.sun.online.serviceverificationcode.ServiceVerificationCodeApplication
設(shè)計價值
依賴方:后續(xù)的Web服務工程中,只需要@EnableWebConfigure
即可獲得相應的通用能力
被依賴方:通過拓展 InternalCommonBeanConfiguration
即可令所有依賴方無需代碼改動直接獲得支持,方便升級維護
到此這篇關(guān)于Java使用@EnableEurekaServer實現(xiàn)自動裝配詳解的文章就介紹到這了,更多相關(guān)Java @EnableEurekaServer內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
spring security在分布式項目下的配置方法(案例詳解)
這篇文章主要介紹了spring security在分布式項目下的配置方法,本文通過一個項目案例給大家詳細介紹,通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-10-10springboot+WebMagic+MyBatis爬蟲框架的使用
本文是對spring boot+WebMagic+MyBatis做了整合,使用WebMagic爬取數(shù)據(jù),然后通過MyBatis持久化爬取的數(shù)據(jù)到mysql數(shù)據(jù)庫。具有一定的參考價值,感興趣的可以了解一下2021-08-08Java的springcloud Sentinel是什么你知道嗎
這篇文章主要介紹了Java之springcloud Sentinel案例講解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下2021-08-08SpringBoot實現(xiàn)簡易支付寶網(wǎng)頁支付功能
小編最近實現(xiàn)一個功能基于springboot程序的支付寶支付demo,非常不錯適合初學者入門學習使用,今天把SpringBoot實現(xiàn)簡易支付寶網(wǎng)頁支付功能的示例代碼分享給大家,感興趣的朋友參考下吧2021-10-10SpringBoot登錄、退出、獲取用戶信息的session處理方案
這篇文章主要介紹了SpringBoot登錄、退出、獲取用戶信息的session處理,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-08-08