阻止Spring容器对提供的Bean执行注入操作。
阻止Spring容器对提供的Bean执行注入操作。
我的目标是在ItemWriter
和JobRepository
中分别使用不同的DataSource
实例来使用Spring Batch,这应该像这样工作。
不幸的是,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); } } }
我认为这是由于在package org.springframework.batch.core.configuration.annotation;
中定义的setter注入引起的。
@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注入?
问题的出现的原因是Spring容器会对提供的Bean进行注入,但在某些情况下,我们需要阻止Spring容器对提供的Bean进行注入。
解决方法是尝试重写DefaultBatchConfigurer类的setDataSource方法,并在setDataSource方法中添加限定符。具体代码如下:
@Bean BatchConfigurer configurer(@Qualifier("secondaryDataSource") DataSource dataSource) { return new DefaultBatchConfigurer(dataSource) { @Override public void setDataSource(@Qualifier("secondaryDataSource") DataSource dataSource) { super.setDataSource(dataSource); } }; }
另外,我们也可以尝试在重写方法时不添加任何注解。不过,我不确定Spring在类层次结构中是否也会搜索注解。