我的目标是将Spring Batch与DataSource
的{{1}}的不同实例分别用于我的ItemWriter
和JobRepository
like this。
不幸的是,Spring容器会在稍后阶段注入主数据源,我可以通过调试器确认。这是我的配置:
@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-injection引起的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注入吗?
答案 0 :(得分:2)
Ttry要覆盖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是否在类层次结构中搜索注释。