Spring 作为 Java 世界非官方标准框架,任何一个中间件想要得到良好的发展,必须完美支持 Spring 的各种特性,即:无缝融入 Spring。
Apollo 作为分布式配置中心,服务于 Java 应用程序,Java 应用程序可以通过 Apollo 提供的 Client 获取远程配置信息。而如何将这个 Client 高度融合到用户的应用程序中呢?
这就需要针对 Spring 提供给我们的接口进行扩展。
在之前的文章中,已经大致聊过 Spring 的一些扩展接口: 深入理解Spring 之 Spring 进阶开发必知必会 之 Spring 扩展接口 。
而想融入 Spring,首先得找到入口,然后才能注册相关的类进行自己系统的初始化。 所以,如何找到并处理入口成了一门学问,我们今天看看 apollo 如何处理的。
XML 是传统 Java 项目的配置文件,特别是 Spring MVC 项目。虽然现在都是使用的自动化配置,但仍然有一些遗留项目使用 XML,因此,支持 XML 是大部分中间件的必须工作。
支持 XML 需要准守 Spring 的几个约定:
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 关键类的注册。
相对于基于XML的配置,基于Java的配置是目前比较流行的方式。
@Import 注解的使用方式:
@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
在以后的开发中,如果想融入 Spring,就可以通过这 3 种方式自行处理。
本文由创作,采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
最后编辑时间为: 2018/06/27 22:44