java 多数据源 切面_SpringBoot+AOP构建多数据源的切换实践

针对微服务架构中常用的设计模块,通常我们都会需要使用到druid作为我们的数据连接池,当架构发生扩展的时候 ,通常面对的数据存储服务器也会渐渐增加,从原本的单库架构逐渐扩展为复杂的多库架构。

当在业务层需要涉及到查询多种同数据库的场景下,我们通常需要在执行sql的时候动态指定对应的datasource。

而Spring的AbstractRoutingDataSource则正好为我们提供了这一功能点,下边我将通过一个简单的基于springboot+aop的案例来实现如何通过自定义注解切换不同的数据源进行读数据操作,同时也将结合部分源码的内容进行讲解。

首先我们需要自定义一个专门用于申明当前java应用程序所需要使用到哪些数据源信息:

packagemutidatasource.annotation;importmutidatasource.config.DataSourceConfigRegister;importmutidatasource.enums.SupportDatasourceEnum;importorg.springframework.context.annotation.Import;importorg.springframework.stereotype.Component;import java.lang.annotation.*;/*** 注入数据源

*

*@authoridea

* @data 2020/3/7*/@Target({ElementType.METHOD,ElementType.TYPE})

@Retention(RetentionPolicy.RUNTIME)

@Documented

@Import(DataSourceConfigRegister.class)public @interfaceAppDataSource {

SupportDatasourceEnum[] datasourceType();

}

这里为了方便,我将测试中使用的数据源地址都配置在来enum里面,如果后边需要灵活处理的话,可以将这些配置信息抽取出来放在一些配置中心上边。

packagemutidatasource.enums;importlombok.AllArgsConstructor;importlombok.Getter;importlombok.NoArgsConstructor;/*** 目前支持的数据源信息

*

*@authoridea

* @data 2020/3/7*/@AllArgsConstructor

@Getterpublic enumSupportDatasourceEnum {

PROD_DB("jdbc:mysql://localhost:3306/db-prod?useUnicode=true&characterEncoding=utf8","root","root","db-prod"),

DEV_DB("jdbc:mysql://localhost:3306/db-dev?useUnicode=true&characterEncoding=utf8","root","root","db-dev"),

PRE_DB("jdbc:mysql://localhost:3306/db-pre?useUnicode=true&characterEncoding=utf8","root","root","db-pre");

String url;

String username;

String password;

String databaseName;

@OverridepublicString toString() {return super.toString().toLowerCase();

}

}

之所以要创建这个@AppDataSource注解,是要在springboot的启动类上边进行标注:

packagemutidatasource;importmutidatasource.annotation.AppDataSource;importmutidatasource.enums.SupportDatasourceEnum;importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;/***@authoridea

* @data 2020/3/7*/@SpringBootApplication

@AppDataSource(datasourceType={SupportDatasourceEnum.DEV_DB, SupportDatasourceEnum.PRE_DB, SupportDatasourceEnum.PROD_DB})public classSpringApplicationDemo {public static voidmain(String[] args) {

SpringApplication.run(SpringApplicationDemo.class);

}

}

借助springboot的ImportSelector 自定义一个注册器来获取启动类头部的注解所指定的数据源类型&#x

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值