注册一个不影响任何自动配置的任意Bean并取用

做Camunda集成的时候,需要注册一个独立于原有系统 DataSourceDataSourceTransactionManager 的Bean(这两个类都必须走Bean的生命流程才能完全初始化),但又希望完全不影响原来的配置,包括Spring提供的自动配置类 DataSourceTransactionManagerAutoConfigurationDataSourceAutoConfiguration

但是这两个自动配置类都有这样的注解

@ConditionalOnMissingBean({ DataSource.class, XADataSource.class })

@ConditionalOnMissingBean(TransactionManager.class)

@ConditionalOnSingleCandidate(DataSource.class)

导致一旦注册bean,就会使原有的自动配置类失效

经过一番折磨,终于找到了解决办法 只要把返回值设为Object,就不会被匹配到Bean的Type
如果还设置了 @Bean(name = "camundaBpmDataSource", autowireCandidate = false)
就可以避免被自动导入,只能被从ApplicationContext中直接 getBean("camundaBpmDataSource",DataSource.class)以bean名字获取

@Role(BeanDefinition.ROLE_INFRASTRUCTURE)
@Bean(name = "camundaBpmDataSource", autowireCandidate = false)
@ConditionalOnProperty(prefix = "bpm.datasource", name = "use-separate-data-source", matchIfMissing = true)
public Object createDataSource(BpmDataSourceProperties bpmDataSourceProperties) {
    //单独创建数据源和事务管理器
    DataSourceBuilder<?> dataSourceBuilder = DataSourceBuilder.create().username(bpmDataSourceProperties.getUsername()).password(bpmDataSourceProperties.getPassword())
            .url(bpmDataSourceProperties.getUrl())
            .driverClassName(bpmDataSourceProperties.getDriverClassName());
    if (bpmDataSourceProperties.getType() != null) {
        dataSourceBuilder.type(bpmDataSourceProperties.getType());
    }
    return dataSourceBuilder.build();
}

需要依赖注入的时候

public class BpmDatasourceConfig{
private final DataSource bpmDataSource;
    //构造参数注入
    public BpmDatasourceConfig(ApplicationContext applicationContext) {
        this.bpmDataSource = applicationContext.getBean("camundaBpmDataSource",DataSource.class);
    }
}

版权声明:本文为muyuanjin67原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。