基于Spring Java的配置"鸡肉和蛋的情况"

时间:2015-11-14 06:47:47

标签: spring spring-java-config

刚刚开始研究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有两个实现,它们基于Spring实例化的一个或另一个实例化。对于这个例子,我们假设这是实现:

@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 bean时,(即使我尝试将其标记为lazy)dsconfig变量值似乎为null。

我想首先处理@beans,然后处理所有Autowire s,是否有解决方法?如何在创建bean之前告诉spring注入dsconfig变量,或者在注入@beans之后以某种方式创建dsconfig

1 个答案:

答案 0 :(得分: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存在并将被注入。