【发布时间】:2020-03-21 21:52:07
【问题描述】:
我从同事的代码中读到了这些行:
@Bean(name = "mysql")
@ConfigurationProperties(prefix = "spring.mysql")
@Primary
public DataSource mysqlDataSource() {
return DataSourceBuilder.create().build();
}
@Bean
public ClassA classA () {
return new ClassA (this.mysqlDataSource());
}
@Bean
public ClassB classB () {
return new ClassB (this.mysqlDataSource());
}
我认为这将为 Bean classA 和 classB 创建 2 个数据源。为了注入数据源,我们需要这样的东西:
@Bean
public ClassA classA (DataSource ds) {
return new ClassA (ds);
}
但是 Spring 只创建一个数据源,并且 this.mysqlDataSource() 每次都返回相同的数据源。它是怎么发生的?如果我确实需要另一个数据源,我需要即时创建它吗?
【问题讨论】:
-
Spring 默认使用
@Bean创建一个实例,通常情况下,这是正确的做法。假设你的DataSource是一个真正的数据源,你为什么需要 2 个 bean? -
第二个问题只是出于好奇。例如:我需要一个具有不同超时的数据源。我真正想知道的是为什么this.mysqlDataSource()没有用spring创建一个新的Datasource?
标签: spring-boot dependency-injection coding-style