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
名为 dataSource
,PlatformTransactionManager
名为 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
并推出您自己的配置。
我有两个自定义 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
名为 dataSource
,PlatformTransactionManager
名为 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
并推出您自己的配置。