springweb

动态数据源配置

2019-09-30  本文已影响0人  李木鱼789

解决思路:使用spring提供的AbstractRoutingDataSource结合AOP进行动态配置,ThreadLocal进行动态数据存储。


实现步骤:

ps:详见源码


使用方式

//在需要更改数据源的方法上加
@DataSource(value = DataSourceType.Slave)

运行原理


Druid与Hikari


测试


注解

  1. @ConfigurationProperties注解:
    使用@EnableConfigurationProperties开启@ConfigurantionProperties注解的支持。使用该注解的bean可以通过标准方式注册到容器。
    @EnableConfigurationProperties只定义了一个value属性,用于设置一组使用了注解的@ConfigurationProperties的类,可以作为bean定义注册到容器中。
  2. @ConditionOnProperty注解:
    控制某个Configuration是否生效,通过name以及havingValue实现,其中name用来从application.yml中读取某个属性,若值为空,则返回false,若值不为空,则将该值与havingValue指定的值进行比较,如果一样返回true,否则返回false,若返回false,则该configuration不生效,true则生效

AbstractRoutingDataSource
Spring提供的动态数据源配置类,充当了DataSource的路由中介,能在运行时,根据某种key值动态切换到真正的DataSource上.

构造函数

    public DynamicDataSource(DataSource defaultTargetDataSource, Map<Object, Object> targetDataSources){

            super.setDefaultTargetDataSource(defaultTargetDataSource);

            super.setTargetDataSources(targetDataSources);

            super.afterPropertiesSet();
        }

targetDataSources目标数据源,存放多数据源

defaultTargetDataSource默认数据源,初始化、通过key未寻找到数据源、使用切换后数据源方法结束时会使用该数据源

在DataSourceConfiguration中,调用该构造方法,初始化DynamicDataSource后注入IOC容器

数据源解析

    @Override
    public void afterPropertiesSet() {

        if (this.targetDataSources == null) {
            throw new IllegalArgumentException("Property 'targetDataSources' is required");
        }

        this.resolvedDataSources = new HashMap<>(this.targetDataSources.size());

        this.targetDataSources.forEach((key, value) -> {
            Object lookupKey = resolveSpecifiedLookupKey(key);
            DataSource dataSource = resolveSpecifiedDataSource(value);
            this.resolvedDataSources.put(lookupKey, dataSource);
        });

        if (this.defaultTargetDataSource != null) {
            this.resolvedDefaultDataSource = resolveSpecifiedDataSource(this.defaultTargetDataSource);
        }
    }

将构造函数传入数据源解析后分别存为resolvedDataSources和defaultTargetDataSource

工作机制

上一篇 下一篇

猜你喜欢

热点阅读