java - Spring-Boot:如何限制 Bean 的可见性
问题描述
我将两个自定义PlatformTransactionManager
bean 注入到 Spring 框架中,具体names
如下:
@Bean(name = "ubldbTransactionManager")
protected PlatformTransactionManager transactionManager(
@Qualifier("ubldbEntityManagerFactory") EntityManagerFactory entityManagerFactory) {
return new JpaTransactionManager(entityManagerFactory);
}
@Bean(name = "bpdbTransactionManager")
public PlatformTransactionManager bpdbTransactionManager(
@Qualifier("bpdbEntityManagerFactory") EntityManagerFactory entityManagerFactory) {
return new JpaTransactionManager(entityManagerFactory);
}
第 3 方库具有@Autowired protected PlatformTransactionManager transactionManager;
依赖项。因此,第 3 方库不应该使用两者中的任何一个TransactionManagers
。但是,正如您所见,外部库中没有Qualifier
依赖注入,我收到如下错误:
Field transactionManager in org.camunda.bpm.spring.boot.starter.configuration.impl.DefaultDatasourceConfiguration required a single bean, but 2 were found:
- bpdbTransactionManager: defined by method 'bpdbTransactionManager' in class path resource [eu/nimble/service/bp/config/BusinessProcessDBConfig.class]
- ubldbTransactionManager: defined by method 'transactionManager' in class path resource [eu/nimble/service/bp/config/UBLDBConfig.class]
那么,我怎样才能限制两者的可见性,以Beans
使 3rd 方库无法访问它们呢?
解决方案
DefaultDatasourceConfiguration
提供使用默认 Spring bean,例如DataSource
nameddataSource
和PlatformTransactionManager
named transcationManager
。它可以将 Camunda 粘合到 Spring Boot 应用程序中,该应用程序默认具有单个数据源。
由于您已经创建了自己的PlatformTransactionManager
bean,因此这个禁用了 Spring Boot 的默认事务管理器 bean 命名transcationManager
(根据TransactionAutoConfiguration
Spring Boot 自动配置逻辑)。
您很可能需要为 Camunda 的流程引擎再定义一个transactionManager
(并且可能),这需要它自己的模式。dataSource
确保使用正确的 bean 名称,如下所示:
@Bean
public PlatformTransactionManager transactionManager() {
...
}
从 Spring 4 开始,bean 名称是自动连接时的默认限定符,因此新的事务管理器将被连接到DefaultDatasourceConfiguration
,因为它与类中的字段名称匹配。
或者,如果 Spring Boot 默认设置不适合您,请不要使用DefaultDatasourceConfiguration
和推出您自己的配置。
推荐阅读
- binary - Datastage:将二进制转换为 Base64
- php - 如何在 boostrap 模式中预览表单数据
- c# - unity AddRelativeForce 锁轴
- android - 将字符串变量从 recyclerview 传递到片段
- reactjs - 客户端上呈现的内容与服务器上呈现的内容不同的页面上的类名错误
- sharepoint-2013 - 自定义显示表单中的超链接
- reactjs - 如何在 React 中管理 4 层的 Z-index?
- javascript - WebRTC + nodejs/socketio 没有音频
- prolog - Prolog:存储操作的结果
- r - 通过 R 中的 data.table 自定义 dcast