首页 > 解决方案 > Spring-Boot:如何限制 Bean 的可见性

问题描述

我将两个自定义PlatformTransactionManagerbean 注入到 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 方库无法访问它们呢?

标签: javaspringspring-bootvisibilitycamunda

解决方案


DefaultDatasourceConfiguration提供使用默认 Spring bean,例如DataSourcenameddataSourcePlatformTransactionManagernamed transcationManager。它可以将 Camunda 粘合到 Spring Boot 应用程序中,该应用程序默认具有单个数据源。

由于您已经创建了自己的PlatformTransactionManagerbean,因此这个禁用了 Spring Boot 的默认事务管理器 bean 命名transcationManager(根据TransactionAutoConfigurationSpring Boot 自动配置逻辑)。

您很可能需要为 Camunda 的流程引擎再定义一个transactionManager(并且可能),这需要它自己的模式。dataSource确保使用正确的 bean 名称,如下所示:

@Bean
public PlatformTransactionManager transactionManager() {
  ...
}

从 Spring 4 开始,bean 名称是自动连接时的默认限定符,因此新的事务管理器将被连接到DefaultDatasourceConfiguration,因为它与类中的字段名称匹配。

或者,如果 Spring Boot 默认设置不适合您,请不要使用DefaultDatasourceConfiguration和推出您自己的配置。


推荐阅读