springboot动态数据源

springboot如何根据参数传递的连接信息动态创建数据源呢?网上找的都是在配置文件中预先写死了的数据源、再动态切换数据源,我需要的是配置文件中只有一个主数据源,然后根据前台传递的参数动态连接指定的数据库

阅读 3.6k
2 个回答

AbstractRoutingDataSource,内部维护了一个map,指定key就能获取到对应的datasource,你可以将数据源维护到你的主库中,读取表中的数据源,这样你维护表数据,即维护动态数据源,前端也可只传入key就能拿到datasource,屏蔽掉敏感信息

分两步

  1. 接收命令行参数
    关于如何在java里调用命令行有很多类库,下面是我个人比较喜欢的:
<dependency>
    <groupId>com.beust</groupId>
    <artifactId>jcommander</artifactId>
</dependency>

使用非常简单,官网 https://jcommander.org/ 也是浅显易懂。

  1. 组装成spring容器里管理的对象
    这个就更简单了,spring里现成的功能支持:
  • 首先要有一个标注了@Configuration的类
@Configuration
public class MyConfiguration
{
    ...
    // ApplicationArguments是命令行参数的包装类
    @Autowired private ApplicationArguments applicationArguments;

    @Bean("yourCommandLineParams")
    public YourCommandLineParams generateYourCommandLineParams()
    {
        //命令行,以空格分隔
        String[] args = applicationArguments.getSourceArgs;

        //再将args转为jcommander对应的对象
        //这里假设YourCommandLineParams是jcommander对应的对象的java类
    }
}
  • 其次要有一个标注了@Bean的方法

    @ConditionalOnBean(name="yourCommandLineParams")
    @Bean
    public void generateDataSource(YourCommandLineParams yourCommandLineParams)
    {
      String url = yourCommandLineParams.getUrl();
      String user = yourCommandLineParams.getUser();
      String password = yourCommandLineParams.getPassword();
      ....
      return new xxxDataSource(url, user, password);
    }
推荐问题