2014-09-11 13 views
0

我有以下的JAVA支持在Spring 4.0.3配置中,有兩個數據源UND JdbcTemplate的豆類:Spring:Autowired或「Plain」使用@Configuration批註進行調用?

@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 公衆的JdbcTemplate internalJDBCTemplate(){ 返回新的JdbcTemplate(internalDataSource( )); }

@Bean 
public JdbcTemplate publicJDBCTemplate() { 
    return new JdbcTemplate(publicDataSource()); 
} 
___ 

我有其他配置豆類,即autowires所述第一配置和調用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容器創建豆TokenStore它得到由securityDataSource方法在定義DBConfiguration的bean。但它不直接調用方法,它從DI容器中獲取一個bean實例。 Spring對所有bean進行初始化是透明地對開發人員完成的。

請注意,使用@Configuration註解的類只是框架的定義,它們不會被直接執行。

+0

如果我使用「經典」單例(例如基於枚舉), 這種方法的調用,具有「新」操作符會導致每次創建新對象。春天有什麼不同? – 2014-09-11 18:04:26

+0

Spring使用反射來分析配置類。 Spring管理的豆子不是經典的單身人士。他們是普通班級。 Spring負責管理他們的範圍。 – 2014-09-11 20:06:15

相關問題