java - 防止 Spring 容器对提供的 Bean 执行注入(inject)

标签 java spring dependency-injection spring-batch datasource

我的目标是将 Spring Batch 与不同的 DataSource 实例分别用于我的 ItemWriterJobRepository,这应该可以工作 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/

相关文章:

java - 使用 spring-boot-starter-security 的 spring boot 中的基本身份验证不适用于最新版本的 spring-boot-starter-parent

java - 使用FileSystemResource强制下载文件时如何设置 'Content-Disposition'和 'Filename'?

java - 在没有容器的情况下解决 EJB 依赖关系

spring - 如何将 spring 管理的服务 bean 注入(inject) Apache CXF Servlet

java - 如何查看我何时将联系人添加到手机(android)

java - 带 vector 的 JComboBox AutoSuggestion

java - Alfresco通知邮件链接修改

eclipse - 调试、单步执行 AspectJ 编织类方法

java - @ControllerAdvice 与 ResourceHandler 冲突 : Spring 4

java - 如果 bean 试图在其构造函数中加载 Spring 应用程序上下文,会发生什么情况?