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";
}
}