做Camunda集成的时候,需要注册一个独立于原有系统 DataSource 和 DataSourceTransactionManager 的Bean(这两个类都必须走Bean的生命流程才能完全初始化),但又希望完全不影响原来的配置,包括Spring提供的自动配置类 DataSourceTransactionManagerAutoConfiguration、DataSourceAutoConfiguration。
但是这两个自动配置类都有这样的注解
@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版权协议,转载请附上原文出处链接和本声明。