阻止Spring容器对提供的Bean执行注入操作。

15 浏览
0 Comments

阻止Spring容器对提供的Bean执行注入操作。

我的目标是在ItemWriterJobRepository中分别使用不同的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注入?

0
0 Comments

问题的出现的原因是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在类层次结构中是否也会搜索注解。

0