阻止Spring容器对提供的Bean

时间:2017-04-25 15:22:46

标签: java spring dependency-injection spring-batch datasource

我的目标是将Spring Batch与DataSource的{​​{1}}的不同实例分别用于我的ItemWriterJobRepository 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注入吗?

1 个答案:

答案 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是否在类层次结构中搜索注释。