springboot手动注入bean,datasource延迟初始化。多数据源配置

package com.abcd.config;

import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;

import javax.sql.DataSource;

@Component
public class DataSourceConfig {

    @Bean
    public DataSource dodb(){
        DataSourceBuilder dataSourceBuilder = DataSourceBuilder.create();
        dataSourceBuilder.driverClassName("com.mysql.jdbc.Driver");
        dataSourceBuilder.url("jdbc:mysql://192.168.180.121:3306/abcd_sc?useUnicode=true&characterEncoding=utf-8");
        dataSourceBuilder.username("root");
        dataSourceBuilder.password("111111");
        return dataSourceBuilder.build();
    }
}

先启动springboot,这时候没有初始化datasource,数据库也可以不启动。
访问/db后初始化datasource,再访问/db2 和/do1就和平常一样可以使用数据库了

package com.abcd.controller;

import com.zaxxer.hikari.HikariDataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.context.ApplicationContext;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.sql.DataSource;
import java.util.List;

@Controller
public class IndexController {

    @Autowired
    private ApplicationContext applicationContext;

    // http://192.168.3.27:8080/abcd/db
    @GetMapping("/db")
    @ResponseBody
    public String database(){

        BeanDefinitionRegistry registry = (BeanDefinitionRegistry)  applicationContext.getAutowireCapableBeanFactory();

        BeanDefinitionBuilder builder = BeanDefinitionBuilder.rootBeanDefinition(HikariDataSource.class);
        builder.addPropertyValue("driverClassName", "com.mysql.jdbc.Driver");
        builder.addPropertyValue("jdbcUrl", "jdbc:mysql://192.168.180.121:3306/abcd_sc?useUnicode=true&characterEncoding=utf-8");
        builder.addPropertyValue("username", "root");
        builder.addPropertyValue("password", "111111");
        builder.addPropertyValue("poolName", "my1");

        BeanDefinition def = builder.getBeanDefinition();
        String key = "ds1";
        if(!registry.containsBeanDefinition(key)) registry.registerBeanDefinition(key, def);

        DataSource obj1 = applicationContext.getBean(key, DataSource.class);
        // 获取启动时候配置的datasource,可以这样配置多数据源,延迟数据库连接检查,防止数据库连不上启动不了
        // DataSource obj2 = applicationContext.getBean("dodb", DataSource.class);

        System.out.println(obj1);
        // System.out.println(obj2);

        JdbcTemplate jdbcTemplate = new JdbcTemplate(obj1);


        List resultList = jdbcTemplate.queryForList("show tables;");
        System.out.println(resultList);
        return "db";
    }

    @GetMapping("/db2")
    @ResponseBody
    public String database2(){
        DataSource obj1 = applicationContext.getBean("ds1", DataSource.class);
        JdbcTemplate jdbcTemplate = new JdbcTemplate(obj1);


        List resultList = jdbcTemplate.queryForList("show tables;");
        System.out.println(resultList);

        return "db2";
    }

    @Autowired
    private ProjRepo projRepo;

    @Autowired
    private AcctUserRepo acctUserRepo;

    @GetMapping("/do1")
    @ResponseBody
    public String test(){
        List<Proj> projs = projRepo.findAll();
        System.out.println(projs.size());

        return "db2";
    }


}

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
dynamic-datasource-spring-boot-starter 提供了两种手动初始化数据源的方式: 1. 使用 DataSourceBuilder 类手动创建数据源 你可以使用 DataSourceBuilder 类手动创建数据源,然后将它添加到动态数据源中。具体代码如下: ```java @Configuration public class DataSourceConfig { @Bean @ConfigurationProperties(prefix = "spring.datasource.master") public DataSource masterDataSource() { return DataSourceBuilder.create().build(); } @Bean @ConfigurationProperties(prefix = "spring.datasource.slave1") public DataSource slave1DataSource() { return DataSourceBuilder.create().build(); } @Bean @ConfigurationProperties(prefix = "spring.datasource.slave2") public DataSource slave2DataSource() { return DataSourceBuilder.create().build(); } @Bean public DataSource dynamicDataSource(@Qualifier("masterDataSource") DataSource masterDataSource, @Qualifier("slave1DataSource") DataSource slave1DataSource, @Qualifier("slave2DataSource") DataSource slave2DataSource) { DynamicRoutingDataSource dynamicRoutingDataSource = new DynamicRoutingDataSource(); Map<Object, Object> dataSourceMap = new HashMap<>(3); dataSourceMap.put(DataSourceKey.MASTER.name(), masterDataSource); dataSourceMap.put(DataSourceKey.SLAVE1.name(), slave1DataSource); dataSourceMap.put(DataSourceKey.SLAVE2.name(), slave2DataSource); // Set master datasource as default dynamicRoutingDataSource.setDefaultTargetDataSource(masterDataSource); // Set slave datasource as target datasource dynamicRoutingDataSource.setTargetDataSources(dataSourceMap); // To put datasource keys into DataSourceContextHolder to judge if the datasource is exist DynamicDataSourceContextHolder.dataSourceKeys.addAll(dataSourceMap.keySet()); return dynamicRoutingDataSource; } } ``` 2. 手动添加数据源到动态数据源中 你也可以手动将已经创建好的数据源添加到动态数据源中。具体代码如下: ```java @Autowired private DynamicRoutingDataSource dynamicRoutingDataSource; @Bean public void addDataSource() { DataSource dataSource = createDataSource(); dynamicRoutingDataSource.addDataSource("key", dataSource); } ``` 以上两种方式都是可以手动初始化数据源的,只需要根据具体的场景选择合适的方式即可。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值