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 注释自动装配或“普通”调用?的主要内容,如果未能解决你的问题,请参考以下文章

SpringBoot整合redis

springboot整合redis

springboot整合redis

springboot整合redis

springboot整合redis

通过Java代码装配Bean