刚刚开始研究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
?
答案 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存在并将被注入。