记录一下ssm项目配置多数据源的方式。
使用场景:多个单体架构的项目存在依赖或者衍生关系的时候,我们不得不在同一个项目使用多个数据源。
涉及到的技术:jdk1.8、jdk自定义注解、spring aop、java反射。
原理:利用spring框架提供的AbstractRoutingDataSource,顾名思义,数据源路由。这里我们把它理解为管理数据源的路由器,他并不管理数据源生存与销毁,他只是数据源传递者。举个核桃:假如mybatis接收到sql execute指令,此时需要sqlsession来连接数据库,众所周知sqlsession需要我们提供数据源由sqlsessionfactory工厂生产(工厂模式就不再介绍了),AbstractRoutingDataSource 就提供了“后门”让开发者可以动态地选择使用哪一个数据源交给 sqlsession工厂。 of cource,如果项目仅需要一条数据源,那就完全没必要去设置了。
实现思路:自定义注解@DataSource保存在spring容器中注册的数据源,业务层实现类加上@DataSource注解,利用spring apo切入业务层的所有方法,在切点中过滤加上@DataSource注解的类或方法,并获取到该注解中的数据源名称保存到ThreadLocal<String> 中,通过jdk官方的描述可以知道,每个线程都有独立的变量副本。接下来我们在spring选择数据源的时候把ThreadLocal<String>中保存的数据源取出来即可。
配置步骤:1,准备多个数据源。
这里准备了两个数据源
2,新建动态数据源类并且继承AbstractRoutingDataSource ,并且注册到spring容器中
3,配置apo
最后测试通过,结果就不贴出来了。