Spring:使用@Configuration 注释自动装配或“普通”调用?
Posted
技术标签:
【中文标题】Spring:使用@Configuration 注释自动装配或“普通”调用?【英文标题】:Spring: Autowired or "Plain" Call by using the @Configuration annotations? 【发布时间】:2014-11-05 02:08:52 【问题描述】:我在 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;
... @豆角,扁豆 公共 JdbcTemplate internalJDBCTemplate() 返回新的 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 作用域是单例的,所以数据源只会被初始化一次。
当一个 DI 容器创建 bean TokenStore 时,它会通过 securityDataSource 方法获得一个在 DBConfiguration 中定义的 bean。但它不直接调用该方法,它从 DI 容器中获取一个 bean 实例。 Spring 对开发人员透明地完成所有 bean 的初始化。
请注意,使用 @Configuration 注释的类只是框架的定义,它们不会直接执行。
【讨论】:
如果我使用“经典”单例(例如基于枚举),则调用具有“new”运算符的此类方法会导致每次创建新对象。春天有什么不同? Spring 使用反射解析配置类。 Spring 管理的 Bean 不是经典的单例。他们是普通的班级。 Spring 负责管理它们的作用域。以上是关于Spring:使用@Configuration 注释自动装配或“普通”调用?的主要内容,如果未能解决你的问题,请参考以下文章