Spring-Boot:如何限制Beans的可见性

Spring-Boot: How to restrict the visibility of Beans

我有两个自定义 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 中的 none。但是,如您所见,外部库中的依赖项注入没有 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 的可见性,从而使第 3 方库无法访问它们?

使用@Qualifier注解 @Qualifier 注释用于解决自动装配冲突,当有多个相同类型的 bean 时。

@Bean
@Qualifier("ubldbTransactionManager")
protected PlatformTransactionManager transactionManager

@Bean
@Qualifier("bpdbTransactionManager")
public PlatformTransactionManager bpdbTransactionManager
提供

DefaultDatasourceConfiguration 以使用默认 Spring bean,例如DataSource 名为 dataSourcePlatformTransactionManager 名为 transcationManager。它可以将 Camunda 粘合到 Spring 启动应用程序中,默认情况下只有一个数据源。

由于您已经创建了自己的 PlatformTransactionManager bean,因此禁用了 Spring Boot 的默认事务管理器 bean,名为 transcationManager(根据 TransactionAutoConfiguration Spring Boot auto -配置逻辑)。

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

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

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

或者,如果 Spring 引导默认值不适合您,请不要使用 DefaultDatasourceConfiguration 并推出您自己的配置。