项目源码
https://github.com/monkeychen/xspring
xspring是个组件集,后续会不断增加新的通用组件,本文所介绍的动态多数据源组件位于xspring项目的xspring-data模块中,其maven坐标如下(尚未上传至maven中央库):
1 | <dependency> |
设计目标
- 无须定义繁琐的配置信息,使用方只需要提供基本的JDBC连接参数即可
- 与spring框架无缝集成
- 默认使用Druid数据库连接池,但支持自定义扩展(可以使用其他数据库连接池)
技术原理
本框架是在spring框架提供的各种特性的基础上进行开发的,具体如下:
- 抽象的数据源路由类:
AbstractRoutingDataSource
- 基于AOP及注解实现数据源动态切换
xspring-core组件
core组件是所有其他组件的基础,其提供了通用的事件总线、日志管理等功能。其中XspringApplication
是整个框架的启动类,通过调用这个启动类的startup静态方法,并提供您打上@org.springframework.context.annotation.Configuration
注解的启动类来启动您的应用。
框架启动时按如下顺序加载配置文件
- file:./config/env.properties
- classpath:/config/env.properties
- file:./config/xspring.properties
- file:./xspring.properties
- classpath:./config/xspring.properties
- classpath:./xspring.properties
上述配置文件中env.properties
文件中的属性信息支持热加载(即每隔指定时间框架都会读取该文件并更新至SystemProperties),相关源码请参考类EnvironmentInitializer
.
基于Xspring框架的应用启动示例代码如下:
1 |
|
XspringApplication
类的startup
方法会创建XspringApplication
实例并调用其run
方法:
1 | public static ConfigurableApplicationContext startup(Class<?> annotatedClass, String[] args) { |
在run
方法中,框架会通过SPI方式加载其他组件提供的标注有@Configuration
注解的org.xspring.core.extension.ModuleConfiguration
接口实现类,从而启动其他组件。
SPI声明统一存放在各个组件的classpath:/META-INF/spring.factories
文件中,整个加载过程源码如下:
1 | public ConfigurableApplicationContext run(Class<?> annotatedClass, String[] args) { |
xspring-core组件还提供了一个基于Google Guava库的事件总线模型,有兴趣的朋友可直接参考
org.xspring.core.eventbus
包下的相关源码。