我在Spring 4.0.3配置中支持以下JAVA,它有两个DataSource和JdbcTemplate bean:
@PropertySource("classpath:db.properties")
@Configuration
public class DBConfiguration {
.....
@Autowired
Environment env;
@Bean
public DataSource internalDataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
// init dataSource setters for DATABASE_1
return dataSource;
}
@Bean
public DataSource publicDataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
// init dataSource setters for DATABASE_2
return dataSource;
}
}
... @Bean public JdbcTemplate internalJDBCTemplate(){return new JdbcTemplate(internalDataSource()); }
@Bean
public JdbcTemplate publicJDBCTemplate() {
return new JdbcTemplate(publicDataSource());
}
___
我有其他配置bean类,自动装配第一个配置并调用internalDataSource()方法:
@Import(DBConfiguration.class)
@Configuration
public class AuthConfiguration {
@Autowired
private DBConfiguration dbConfiguration;
@Autowired
private TokenStore tokenStore;
@Bean
public TokenStore tokenStore() {
return new JdbcTokenStore(dbConfiguration.securityDataSource());
}
...}
我想,即使DBConfiguration已导入并自动装入AuthConfiguration类,每次调用dbConfiguration.securityDataSource()都会导致新的DriverManagerDataSource()每次初始化数据源 .
它是否相关?
1 回答
Spring中的默认bean作用域是singleton,因此数据源只会被初始化一次 .
当DI容器创建bean TokenStore 时,它会通过 securityDataSource 方法获取 DBConfiguration 中定义的bean . 但它不直接调用该方法,它从DI容器中获取bean实例 . Spring对所有bean的初始化都是透明地向开发人员完成的 .
请注意,使用 @Configuration 注释的类只是框架的定义,并且不会直接执行 .