阻止 Spring 容器对提供的 Bean 执行注入
Prevent Spring container from performing injection on provided Bean
我的目标是分别为我的 ItemWriter
和 JobRepository
使用 Spring 具有不同 DataSource
实例的批处理,它们应该可以工作 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-注入
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 注入吗?
尝试覆盖 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 批次有这样的限制也很奇怪。
您甚至可以尝试完全不使用任何注释进行覆盖。我不记得 Spring 是否也在 class 层次结构中搜索注释。
我的目标是分别为我的 ItemWriter
和 JobRepository
使用 Spring 具有不同 DataSource
实例的批处理,它们应该可以工作 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-注入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 注入吗?
尝试覆盖 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 批次有这样的限制也很奇怪。
您甚至可以尝试完全不使用任何注释进行覆盖。我不记得 Spring 是否也在 class 层次结构中搜索注释。