我的目标是将 Spring Batch 与不同的 DataSource
实例分别用于我的 ItemWriter
和 JobRepository
,这应该可以工作 like this .
不幸的是,Spring 容器在稍后阶段注入(inject)主数据源,我可以通过调试器确认这一点。这是我的配置:
@RunWith(SpringJUnit4ClassRunner.class)
@DataJpaTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
@SpringBootTest(classes = { BatchTest.DatabaseConfig.class, BatchTest.BatchTestConfig.class })
public class BatchTest {
@Configuration
static class DatabaseConfig {
@Bean
@Primary
@ConfigurationProperties("spring.datasource")
public DataSource primaryDataSource() {
return DataSourceBuilder.create()
.build();
}
@Bean
@ConfigurationProperties("spring.secondaryDatasource")
public DataSource secondaryDataSource() {
return DataSourceBuilder.create()
.build();
}
}
@Configuration
@EnableBatchProcessing
static class BatchTestConfig {
@Bean()
BatchConfigurer configurer(@Qualifier("secondaryDataSource") DataSource dataSource) {
return new DefaultBatchConfigurer(dataSource);
}
}
}
我认为这是由于定义的setter注入(inject)
package org.springframework.batch.core.configuration.annotation;
@Component
public class DefaultBatchConfigurer implements BatchConfigurer {
@Autowired(required = false)
public void setDataSource(DataSource dataSource) {
this.dataSource = dataSource;
this.transactionManager = new DataSourceTransactionManager(dataSource);
}
}
所以现在我想知道上面提到的 SO 响应如何在我的情况下起作用或者更确切地说不起作用。我可以以某种方式禁用所提供的 bean 上的附加 setter 注入(inject)吗?
最佳答案
尝试重写 DefaultBatchConfigurer#setDataSource
并将限定符添加到 setDataSource
方法:
@Bean()
BatchConfigurer configurer(@Qualifier("secondaryDataSource") DataSource dataSource) {
return new DefaultBatchConfigurer(dataSource) {
@Autowired(required = false)
public void setDataSource(@Qualifier("secondaryDataSource") DataSource dataSource) {
super.setDataSource(dataSource);
}
};
}
我同意这有点奇怪,但 Spring Batch 有这样的限制也很奇怪。
您甚至可以尝试在没有任何注释的情况下进行覆盖。我不记得 Spring 是否也在类层次结构中搜索注释。
关于java - 防止 Spring 容器对提供的 Bean 执行注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43614849/