最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java使用@EnableEurekaServer實現(xiàn)自動裝配詳解

 更新時間:2022年10月26日 08:51:29   作者:hongmin.shm  
這篇文章主要介紹了Java使用@EnableEurekaServer實現(xiàn)自動裝配過程,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧

實踐

仿照@EnableEurekaServer實現(xiàn)自動裝配

如果你使用過Eureka作為微服務(wù)的注冊中心,那么對@EnableWebConfigure一定很了解,該注解用來開啟Eureka服務(wù)端作為微服務(wù)的注冊中心,其背后是springboot自動裝配原理。

本次,將仿照此設(shè)計思路,完成Web應(yīng)用統(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 {
}

那么,如何通過在啟動類標(biāo)識此注解即可實現(xiàn)EurekaServer的自動裝配呢?

答案其實在這一句

@Import(EurekaServerMarkerConfiguration.class)

該注解使用了@Import注解導(dǎo)入了一個配置類 EurekaServerMarkerConfiguration.java,該配置類源碼如下

@Configuration(proxyBeanMethods = false)
public class EurekaServerMarkerConfiguration {
	@Bean
	public Marker eurekaServerMarkerBean() {
		return new Marker();
	}
	class Marker {
	}
}

我們看到,該配置類聲明了一個Bean 內(nèi)部類Marker

那么,為什么聲明這個類?這個類看起來沒有任何屬性和方法

我們在導(dǎo)入的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),一個條件裝配使用了這個類,該注解的含義是當(dāng)上下文中有Marker實例時,進(jìn)行注解所在配置類的裝配,也就是 EurekaServerAutoConfiguration

通過查看其源碼,可以看到大量的EurekaServer相關(guān)Bean聲明,也就是說,實現(xiàn)了EurekaServerAutoConfiguration的裝配,也就實現(xiàn)類EurekaServer的裝配

好的,思路清晰了 通過@EnableEurekaServer來導(dǎo)入EurekaServerMarkerConfiguration,進(jìn)而將內(nèi)部類Marker實例化到spring上下文中,通過條件裝配,再來裝配EurekaServerAutoConfiguration配置文件

也就是說 內(nèi)部類Marker 起到了一個開關(guān)的作用

接下來只剩最后一個問題,我們只寫了一行代碼,也就是 @EnableEurekaServer 加到了springboot啟動類上,那么 EurekaServerAutoConfiguration 是怎樣被識別并導(dǎo)入到我們自己的項目中呢?

涉及到另一個知識點 spring.factories 它可以實現(xiàn),將我們編寫的jar包中的配置類,能夠被依賴方識別到。

關(guān)于這點請自行百度查閱前置知識,只要理解它的作用,代碼其實很簡單。關(guān)于這點多說一下,許久之前我曾經(jīng)有過疑惑,就是我編寫的Common包其中包含了使用spring注解@Component、@Service、@Controller等修飾的Bean,那么引入這個jar包的spring工程,如何能夠?qū)?/p>

這個Bean注入到spring上下文中呢,使用@ComponentScan掃描,顯然勉強(qiáng)能夠?qū)崿F(xiàn),但是如果所有引入的工程都去改寫@ComponentScan 顯然不現(xiàn)實,spring.factories就可以靈活的實現(xiàn)該需求,自動的將配置進(jìn)行導(dǎo)入

@EnableWebConfigure

@EnableWebConfigure 是我自定義的注解,期望用它來自動開啟Web相關(guān)的公共能力,實現(xiàn)如下:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@Import(WebMarkerConfiguration.class)
public @interface EnableWebConfigure {
}

注解標(biāo)識在啟動類上即可,它并沒有屬性和方法,僅導(dǎo)入了另一個配置類 WebMarkerConfiguration.class

@Configuration
public class WebMarkerConfiguration {
    @Bean
    public Marked createMarkedInstance(){
        return new Marked();
    }
    class Marked{
    }
}

可以看到,我很懶,連名字都跟EurekaServer中的實現(xiàn)一樣…

而引用此Marked標(biāo)識的是配置類 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,還導(dǎo)入了@Import({WebConfig.class, WebMvcConfig.class}) 這兩個類用來配合@ResponseBody或者@RestController實現(xiàn)JSON序列化

最后,通過在internal-common工程resource文件下,新建 META-INF/spring.factories 文件,來暴露InternalCommonBeanConfiguration,以方便其他項目能夠在依賴時,自動導(dǎo)入。

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
  org.sun.online.internalcommon.configure.InternalCommonBeanConfiguration

具體工程中的應(yīng)用請見 org.sun.online.serviceverificationcode.ServiceVerificationCodeApplication

設(shè)計價值

依賴方:后續(xù)的Web服務(wù)工程中,只需要@EnableWebConfigure 即可獲得相應(yīng)的通用能力

被依賴方:通過拓展 InternalCommonBeanConfiguration 即可令所有依賴方無需代碼改動直接獲得支持,方便升級維護(hù)

到此這篇關(guān)于Java使用@EnableEurekaServer實現(xiàn)自動裝配詳解的文章就介紹到這了,更多相關(guān)Java @EnableEurekaServer內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論

龙游县| 广平县| 嘉义市| 海丰县| 恩平市| 泽库县| 万山特区| 辽中县| 交口县| 嘉定区| 凌海市| 蒲江县| 蓝山县| 潮安县| 临安市| 镇远县| 郓城县| 东乌珠穆沁旗| 济阳县| 女性| 中山市| 务川| 万源市| 临汾市| 中方县| 囊谦县| 宽甸| 胶州市| 施秉县| 芒康县| 洪雅县| 三亚市| 晋宁县| 冀州市| 大城县| 吐鲁番市| 嵊州市| 哈尔滨市| 谢通门县| 蕲春县| 松潘县|