【问题标题】:Spring: Autowired or "Plain" Call by using the @Configuration annotations?Spring:使用@Configuration 注释自动装配或“普通”调用?
【发布时间】: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() 每次初始化数据源。

是否正确?

【问题讨论】:

    标签: spring autowired


    【解决方案1】:

    Spring 中默认的 bean 作用域是单例的,所以数据源只会被初始化一次。

    当一个 DI 容器创建 bean TokenStore 时,它会通过 securityDataSource 方法获得一个在 DBConfiguration 中定义的 bean。但它不直接调用该方法,它从 DI 容器中获取一个 bean 实例。 Spring 对开发人员透明地完成所有 bean 的初始化。

    请注意,使用 @Configuration 注释的类只是框架的定义,它们不会直接执行。

    【讨论】:

    • 如果我使用“经典”单例(例如基于枚举),则调用具有“new”运算符的此类方法会导致每次创建新对象。春天有什么不同?
    • Spring 使用反射解析配置类。 Spring 管理的 Bean 不是经典的单例。他们是普通的班级。 Spring 负责管理它们的作用域。
    猜你喜欢
    • 2014-06-30
    • 2012-08-03
    • 2011-03-10
    • 1970-01-01
    • 2011-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多