2015-11-14 41 views
0

就在最近開始尋找到春天特別是其最新的功能,如Java配置等 我有這個有些奇怪的問題:的Spring Java基礎配置「雞和蛋的問題」

Java的配置段:

@Configuration 
@ImportResource({"classpath*:application-context.xml","classpath:ApplicationContext_Output.xml"}) 
@Import(SpringJavaConfig.class) 
@ComponentScan(excludeFilters={@ComponentScan.Filter(org.springframework.stereotype.Controller.class)},basePackages = " com.xx.xx.x2.beans") 
public class ApplicationContextConfig extends WebMvcConfigurationSupport { 
    private static final Log log = LogFactory.getLog(ApplicationContextConfig.class); 

    @Autowired 
    private Environment env; 

    @Autowired 
    private IExtendedDataSourceConfig dsconfig;  

    @PostConstruct 
    public void initApp() { 
    ... 

    } 

    @Bean(name="transactionManagerOracle") 
    @Lazy 
    public DataSourceTransactionManager transactionManagerOracle() { 
     return new DataSourceTransactionManager(dsconfig.oracleDataSource()); 
    } 

IExtendedDataSourceConfig具有其基於彈簧有效簡表的一個或另一箇中實例化的兩種實現方法。對於這個例子讓說這是執行:

@Configuration 
@PropertySources(value = { 
     @PropertySource("classpath:MYUI.properties")}) 
@Profile("dev") 
public class MYDataSourceConfig implements IExtendedDataSourceConfig { 
    private static final Log log = LogFactory.getLog(MYDataSourceConfig.class); 

    @Resource 
    @Autowired 
    private Environment env; 

    public MYDataSourceConfig() { 
     log.info("creating dev datasource"); 
    } 

    @Bean 
    public DataSource oracleDataSource() { 
     DriverManagerDataSource dataSource = new DriverManagerDataSource(); 
     dataSource.setDriverClassName("oracle.jdbc.driver.OracleDriver"); 
     dataSource.setUrl(env.getProperty("oracle.url")); 
     dataSource.setUsername(env.getProperty("oracle.user")); 
     dataSource.setPassword(env.getProperty("oracle.pass")); 
     return dataSource; 
    } 

的問題是,當transactionManagerOracle豆被調用時,(即使我嘗試將其標記爲懶惰)dsconfig變量值顯示爲空。

我想@beans先處理,然後全部Autowire s,有沒有解決這個問題?如何既跟春天創造豆之前注入dsconfig變量,或以某種方式創建dsconfig@beans注入?

回答

1

您可以將DataSource指定爲事務管理器bean的方法參數。 Spring會自動注入的數據源,這是在積極配置文件中配置:

@Bean(name="transactionManagerOracle") 
@Lazy 
public DataSourceTransactionManager transactionManagerOracle(DataSource dataSource) { 
    return new DataSourceTransactionManager(dataSource); 
} 

如果您仍然需要通過配置類要做到這一點,指定爲參數:

public DataSourceTransactionManager transactionManagerOracle(IExtendedDataSourceConfig dsconfig) {} 

在這兩種方式你聲明對另一個bean的直接依賴,Spring將確保依賴bean存在並將被注入。