Apollo 1 融合 Spring 的三个入口
前言
Spring 作为 Java 世界非官方标准框架,任何一个中间件想要得到良好的发展,必须完美支持 Spring 的各种特性,即:无缝融入 Spring。
Apollo 作为分布式配置中心,服务于 Java 应用程序,Java 应用程序可以通过 Apollo 提供的 Client 获取远程配置信息。而如何将这个 Client 高度融合到用户的应用程序中呢?
这就需要针对 Spring 提供给我们的接口进行扩展。
在之前的文章中,已经大致聊过 Spring 的一些扩展接口:深入理解Spring 之 Spring 进阶开发必知必会 之 Spring 扩展接口。
而想融入 Spring,首先得找到入口,然后才能注册相关的类进行自己系统的初始化。
所以,如何找到并处理入口成了一门学问,我们今天看看 apollo 如何处理的。
第一种入口:XML
XML 是传统 Java 项目的配置文件,特别是 Spring MVC 项目。虽然现在都是使用的自动化配置,但仍然有一些遗留项目使用 XML,因此,支持 XML 是大部分中间件的必须工作。
支持 XML 需要准守 Spring 的几个约定:
- 继承
NamespaceHandlerSupport抽象类,重写 init 方法,调用 registerBeanDefinitionParser 方法,并传入自己继承的AbstractSingleBeanDefinitionParser子类用于解析标签,重写他的 getBeanClass 方法,返回一个 Bean,用于注册相关的 Bean。 - classpath 下创建 META-INF 目录,创建
spring.handlers文件,将 xml 配置中的 URL 指向NamespaceHandlerSupport。 - META-INF 目录下,创建
apollo-1.0.0.xsdxsd 文件,用于解释自定义标签。 - META-INF 目录下,继续创建
spring.schemas文件,将 xml 配置中的 xsd URL 指向 xsd 文件。
如果你的 xml 配置中,引用了 apollo 的标签,Spring 将会根据 xml 中的 URL 找到 spring.handlers 中的 NamespaceHandlerSupport 类,并对标签进行解析。也会从 getBeanClass 得到一个设置的 bean,在这个 bean 里,做了 apollo 关键类的注册。
第二种入口:@Import 注解
相对于基于XML的配置,基于Java的配置是目前比较流行的方式。
@Import 注解的使用方式:
- 定义一个自己的启动注解。并标注 @import 注解, 其实就是 xml 中的 import 标签,在该注解中,可以配置一个类,这个类就会注册进 Spring 的容器,成为 Bean,你就可以在这个 bean 里做文章。
在 apollo 中,使用方式如下:
@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 功能。
第三种入口:SpringBoot Starter
目前最流行的框架就是 Spring Boot ,兼容 SpringBoot 是一个大趋势。
Spring Boot 提供 spring-boot-autoconfigure 让第三方框架兼容 Boot,称之为 starter。
创建一个 starter 需要遵守几个约定:
- maven 引入
spring-boot-autoconfigureartifact. - 创建一个类,实现
ApplicationContextInitializer接口,重写 initialize 方法,该方法在容器初始化的时候调用。 - META-INF 创建
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 种入口:
- XML 方式,通过在 getBeanClass 方法返回系统关键 Bean。
- @Import 注解,通过在注解中定义 Bean,然后在该 Bean 中处理。
- SpringBoot Starter 方式,通过
spring.factories文件中定义自动配置类,可以注册系统关键 bean。
在以后的开发中,如果想融入 Spring,就可以通过这 3 种方式自行处理。
Apollo 1 融合 Spring 的三个入口的更多相关文章
- SpringBoot入门(三)——入口类解析
本文来自网易云社区 上一篇介绍了起步依赖,这篇我们先来看下SpringBoot项目是如何启动的. 入口类 再次观察工程的Maven配置文件,可以看到工程的默认打包方式是jar格式的. <pack ...
- Spring的三种通过XML实现DataSource注入方式
Spring的三种通过XML实现DataSource注入方式: 1.使用Spring自带的DriverManagerDataSource 2.使用DBCP连接池 3.使用Tomcat提供的JNDI
- spring ioc三种注入方式
spring ioc三种注入方式 IOC ,全称 (Inverse Of Control) ,中文意思为:控制反转 什么是控制反转? 控制反转是一种将组件依赖关系的创建和管理置于程序外部的技术. 由容 ...
- Redis实战之征服 Redis + Jedis + Spring (三)
一开始以为Spring下操作哈希表,列表,真就是那么土.恍惚间发现“stringRedisTemplate.opsForList()”的强大,抓紧时间恶补下. 通过spring-data-redis完 ...
- 征服 Redis + Jedis + Spring (三)—— 列表操作【转】
一开始以为Spring下操作哈希表,列表,真就是那么土.恍惚间发现“stringRedisTemplate.opsForList()”的强大,抓紧时间恶补下. 相关链接: 征服 Redis 征服 Re ...
- Spring第三天
Spring第三天 整体课程安排(3天+2天): 第一天:Spring框架入门.IoC控制反转的配置管理.Spring Web集成.Spring Junit集成. 第二天:Spring AOP面向切面 ...
- Spring中三种配置Bean的方式
Spring中三种配置Bean的方式分别是: 基于XML的配置方式 基于注解的配置方式 基于Java类的配置方式 一.基于XML的配置 这个很简单,所以如何使用就略掉. 二.基于注解的配置 Sprin ...
- Spring中三个重要概念 IOC AOP Bean
Spring中三个重要概念 IOC AOP Bean 首先讲解一下Spring框架,以及为什么要使用Spring 框架? spring 是一个很好的容器框架, 是轻量级的IoC和AOP的容器框架,主要 ...
- 相机IMU融合四部曲(三):MSF详细解读与使用
相机IMU融合四部曲(三):MSF详细解读与使用 极品巧克力 前言 通过前两篇文章,<D-LG-EKF详细解读>和<误差状态四元数详细解读>,已经把相机和IMU融合的理论全部都 ...
随机推荐
- xbee/xbeeRPOS1、xbee/xbeePROS2C802.15.4/Digimesh功能方法
Digi XBee 802.15.4的第一个版本也称为S1,是基于Freescale的无线收发器片子设计的.最新的802.15.4模块(内部称号S1B)采用和Digi ZigBee模块相同SOC芯片设 ...
- tomcat 配置 使用 HTTPS
1.生成证书 keytool -genkeypair -alias "tomcat" -keyalg "RSA" -keystore "d:\temp ...
- HTML学习总结(作业五)
1:HTML简介 超文本标记语言,标准通用标记语言下的一个应用.是 网页制作必备的编程语言“超文本”就是指页面内可以包含图片.链接,甚至音乐.程序等非文字元素.超文本标记语言的结构包括“头”部分(英语 ...
- Alpha冲刺 - (8/10)
Part.1 开篇 队名:彳艮彳亍团队 组长博客:戳我进入 作业博客:班级博客本次作业的链接 Part.2 成员汇报 组员1(组长)柯奇豪 过去两天完成了哪些任务 进一步优化代码,结合自己负责的部分修 ...
- IntelliJ IDEA的破解方法
一.下载并安装, IntelliJ IDEA的官网:https://www.jetbrains.com 下载 下载 下载 二.破解. 百度下载一个 JetbrainsCrack-2.7-release ...
- 美团codeM预赛A轮 倒水
[编程题] 倒水 时间限制:1秒 空间限制:32768K 有一个大水缸,里面水的温度为T单位,体积为C升.另有n杯水(假设每个杯子的容量是无限的),每杯水的温度为t[i]单位,体积为c[i]升. 现在 ...
- day13_雷神_前端01
#前端 html 服务器端返回的就是一个字符串,浏览器根据html规则去渲染这个字符串. html 是超文本标记语言,相当于定义统一的一套规则,大家都遵守它,这样就可以让浏览器根据标记语言的规则去解释 ...
- ASP.NET WebApi JObject 使用
ASP.NET WebApi 中使用非Get请求,传递参数需要用对象包裹起来,比如: [HttpPost] public async Task<IActionResult> PostVal ...
- [UWP] 用 AudioGraph 来增强 UWP 的音频处理能力——AudioFrameInputNode
上一篇心得记录中提到了 AudioGraph, 描述了一下 什么是 AudioGraph 以及其中涉及到的各种类型的 节点(Node). 这一篇就其中比较有意思的 AudioFrameInputNod ...
- spring boot开发笔记——mybatis
概述 mybatis框架的优点,就不用多说了,今天这边干货主要讲mybatis的逆向工程,以及springboot的集成技巧,和分页的使用 因为在日常的开发中,当碰到特殊需求之类会手动写一下s ...