Spring 做爲 Java 世界非官方標準框架,任何一箇中間件想要獲得良好的發展,必須完美支持 Spring 的各類特性,即:無縫融入 Spring。java
Apollo 做爲分佈式配置中心,服務於 Java 應用程序,Java 應用程序能夠經過 Apollo 提供的 Client 獲取遠程配置信息。而如何將這個 Client 高度融合到用戶的應用程序中呢?spring
這就須要針對 Spring 提供給咱們的接口進行擴展。springboot
在以前的文章中,已經大體聊過 Spring 的一些擴展接口:深刻理解Spring 之 Spring 進階開發必知必會 之 Spring 擴展接口。框架
而想融入 Spring,首先得找到入口,而後才能註冊相關的類進行本身系統的初始化。
因此,如何找到並處理入口成了一門學問,咱們今天看看 apollo 如何處理的。maven
XML 是傳統 Java 項目的配置文件,特別是 Spring MVC 項目。雖然如今都是使用的自動化配置,但仍然有一些遺留項目使用 XML,所以,支持 XML 是大部分中間件的必須工做。分佈式
支持 XML 須要準守 Spring 的幾個約定:spring-boot
NamespaceHandlerSupport
抽象類,重寫 init 方法,調用 registerBeanDefinitionParser 方法,並傳入本身繼承的 AbstractSingleBeanDefinitionParser
子類用於解析標籤,重寫他的 getBeanClass 方法,返回一個 Bean,用於註冊相關的 Bean。spring.handlers
文件,將 xml 配置中的 URL 指向 NamespaceHandlerSupport
。apollo-1.0.0.xsd
xsd 文件,用於解釋自定義標籤。spring.schemas
文件,將 xml 配置中的 xsd URL 指向 xsd 文件。若是你的 xml 配置中,引用了 apollo 的標籤,Spring 將會根據 xml 中的 URL 找到 spring.handlers
中的 NamespaceHandlerSupport
類,並對標籤進行解析。也會從 getBeanClass 獲得一個設置的 bean,在這個 bean 裏,作了 apollo 關鍵類的註冊。spa
相對於基於XML的配置,基於Java的配置是目前比較流行的方式。code
@Import 註解的使用方式:xml
@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) @Documented @Import(ApolloConfigRegistrar.class) public @interface EnableApolloConfig { String[] value() default {ConfigConsts.NAMESPACE_APPLICATION}; int order() default Ordered.LOWEST_PRECEDENCE; }
從上面能夠看出 ApolloConfigRegistrar
類是 apollo 註冊進的 bean。這個 bean 用於處理 @EnableApolloConfig 註解,同時註冊 apollo 關鍵 Bean 到 Spring 容器中。
用戶只需在 Spring 系統中的某個類上,標註 @EnableApolloConfig ,就能夠經過 Spring 的方式(自動更新,註解等)使用 apollo 功能。
目前最流行的框架就是 Spring Boot ,兼容 SpringBoot 是一個大趨勢。
Spring Boot 提供 spring-boot-autoconfigure
讓第三方框架兼容 Boot,稱之爲 starter。
建立一個 starter 須要遵照幾個約定:
spring-boot-autoconfigure
artifact.ApplicationContextInitializer
接口,重寫 initialize 方法,該方法在容器初始化的時候調用。spring.factories
文件,Boot 啓動時會自動掃描這個文件。須要在這個文件中寫入一個步驟 2 建立的類,相似 org.springframework.context.ApplicationContextInitializer=\com.ctrip.framework.apollo.spring.boot.ApolloApplicationContextInitializer
。這個類的做用是提早(容器初始化前)加載關鍵配置到 Spring 環境。spring.factories
文件中,還須要讓 boot 的 EnableAutoConfiguration
自動配置類指向一個自定義類。這是 SpringBoot starter 的關鍵,例如:org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.ctrip.framework.apollo.spring.boot.ApolloAutoConfiguration
。ApolloAutoConfiguration 就會加入的 apollo 的配置 bean 中。你能夠在這個配置 bean 中,建立一個關鍵 bean ,用於處理系統相關的初始化類。例如 apollo 的方式:@Configuration @ConditionalOnProperty(PropertySourcesConstants.APOLLO_BOOTSTRAP_ENABLED) @ConditionalOnMissingBean(PropertySourcesProcessor.class)// 當Spring Context中不存在該Bean時 public class ApolloAutoConfiguration { @Bean public ConfigPropertySourcesProcessor configPropertySourcesProcessor() { return new ConfigPropertySourcesProcessor(); } }
在 apollo 中,ConfigPropertySourcesProcessor
就是用來註冊系統關鍵 bean 的。
本文重點介紹了 3 種入口:
spring.factories
文件中定義自動配置類,能夠註冊系統關鍵 bean。在之後的開發中,若是想融入 Spring,就能夠經過這 3 種方式自行處理。