【发布时间】:2019-06-07 13:53:34
【问题描述】:
在Java 和Spring Boot 框架中,有一个名为DataSource 的@Bean 用于连接到数据库,并由另一个名为JdbcTemplate 的@Bean 使用,用于在数据库。但是,有一个问题,这个用于连接数据库的@BeanDataSource 需要预先配置连接的属性(url、用户名和密码)。 @Bean DataSource 需要在项目启动时以“空”或“默认”值开头,并在运行时更改此值。我希望某个 Endpoint 执行更改 @Bean 值的操作,更准确地说。并且随着@BeanDataSourceJdbcTemplate的值的变化,将能够在多个数据库中执行动作。
一些细节:
- 我已经评估了使用多个数据库的问题,就我而言,这是必要的。
- 要连接的所有数据库具有相同的模型。
- 我认为我不需要在运行时删除并创建另一个
@BeanDataSource,也许只是覆盖Spring Boot本身已经自动创建的@Bean值。 - 我已经让
@BeanDataSource以“空”值开头,方法是创建一个带有@Bean注释的方法,并返回一个DataSource对象,它实际上就是这个代码:DataSourceBuilder.build().create();。 - 我的英语不是很好,如果不是很容易理解,对不起。
DataSource@Bean代码:
@Bean
public DataSource dataSource() {
return DataSourceBuilder.create().build();
}
主类:
@SpringBootApplication(scanBasePackages = "br.com.b2code")
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class RunAdm extends SpringBootServletInitializer implements
CommandLineRunner {
public static final String URL_FRONTEND = "*";
/**
* Método main do módulo de Gestão.
*
* @param args argumentos de inicialização
* @throws Exception uma exception genérica
*/
public static void main(String[] args) throws Exception {
SpringApplication.run(RunAdm.class, args);
}
@Override
protected SpringApplicationBuilder
configure(SpringApplicationBuilder application) {
return application.sources(RunAdm.class);
}
@Override
public void run(String... args) throws Exception {
}
}
一个类来举例说明我如何使用JdbcTemplate:
@Repository
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class ClienteQueryRepositoryImpl implements ClienteQueryRepository {
private final @NonNull
JdbcTemplate jdbc;
@Override
public List<Cliente> findAll() {
return jdbc.query(ClienteQuerySQL.SELECT_ALL_CLIENTE_SQL, new ClienteRowMapper());
}
}
【问题讨论】:
-
您能否解释一下您为什么要这样做的目的?
-
@ThomasAndolf 我的系统必须是多租户的,不能预先配置多个数据库,这就是我发现它的目的。 :v
-
是的,但为什么不能预先配置?
-
@ThomasAndolf 因为上面的命令需要它,它是计划的。
标签: java spring spring-boot dependency-injection datasource