项目源码
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
包下的相关源码。
xspring-data组件
xspring-data组件的模块定义(启动)类为:XspringDataConfiguration
,其会通过@Import(DataSourceInitializer.class)
方式加载动态数据源初始化配置类。DataSourceInitializer
也是一个@Configurable
注解类,其通过@Bean
的方式定义了datasource
这个动态数据源。
在动态数据源bean创建过程中,组件会通过SPI方式加载DataSourceFactory
这个接口的实现类来获取具体的数据库连接池提供方,框架默认提供了DruidDataSourceFactory
。
您也可以自己提供数据库连接池的实现类(同样定义在各个组件的classpath:/META-INF/spring.factories
文件中),并通过添加org.springframework.core.annotation.Order
注解来指定加载优先级。
DataSourceInitializer
会从属性文件datasource.properties
中加载JDBC配置信息,然后通过DataSourceFactory
实现类创建相关的数据库连接池(真正的数据源)实例。datasource.properties
文件加载位置如下(先后顺序):
- file:./config/datasource.properties
- classpath:/config/datasource.properties
框架默认提供的Druid数据库连接池所使用的datasource.properties
文件内容大致如下(不同的数据库连接池提供方则会有所差别):
1 | # 数据源个数 |
注意:xspring-data组件的动态多数据源目前只支持相同数据库连接池提供方,即只会使用order值最小的
DataSourceFactory
实现类来创建真正的数据源对象。
源码如下:
1 | @Bean |
使用示例见单元测试类:DynamicDataSourceTest, DemoServiceImpl
1 | // DemoServiceImpl源码: |
自定义的XML配置文件xspring-context-test.xml
内容如下:
1 |
|
关键类图
待补充
参考资料:SpringBoot配置文件加载顺序及属性优先级
参考:http://www.importnew.com/17673.html
https://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#resources
file:./config/ -> file:./ -> classpath:/config/ -> classpath:/
如果各个目录下都有相同的配置文件(如application.properties
),则都会被加载进来(即不互斥),但如果多个jar包的相同路径下都存在一样的配置文件,则只会加载第一个匹配的文件(具体由classloader的加载顺序决定);如果每个文件中都包含相同的key,则最左边文件中的key具有最高的优先级,从源码注释也可证明这一点:
1 | // ConfigFileApplicationListener中的描述: |
转载请注明出处:cloudnoter.com