gpt4 book ai didi

java - 使用@PROFILE 管理一个 Spring 接口(interface)的两个或多个实现

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:45:06 26 4
gpt4 key购买 nike

我们希望在生产和开发模式下实现一个接口(interface)的两个实现:

考虑一个接口(interface):

public interface AccountList {
public List<Account> getAllAccounts(String userID) ;
}

有两个实现:

基础实现

 @Service
public AccountListImp1 interface AccountList { ... }

和一些开发实现

 @Service
@Profile("Dev")
public AccountListImp2 interface AccountList { ... }

当我尝试使用 bean 时:

public class TransferToAccount{
@Autowired
private AccountServices accountServices;

}

我收到这个错误:

No qualifying bean of type [AccountList] is defined: expected single matching bean but found 2: coreSabaAccountList,dummyAccountList

在开发过程中,我们将spring.profiles.active设置为dev如下:

<context-param>
<param-name>spring.profiles.active</param-name>
<param-value>Dev</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

我假设设置配置文件名称,将使 spring 对具有不同配置文件的 bean 进行分类,并根据配置文件名称使用它们。

你能告诉我如何解决这个问题吗?我可以使用 @Primary,或更改 applicationContext.xml,但我认为 @profile 应该可以解决我的问题。

最佳答案

我认为您的问题是您的基类 AccountListImp1 没有标记为任何配置文件。我认为您期望如果没有定义 Activity 配置文件,则没有配置文件规范的 bean 将运行,但是当您定义配置文件时,具有此类规范的 bean 将覆盖实现相同接口(interface)但没有配置文件定义的 beans。这种方式行不通。

当使用 Activity 配置文件 X 时,spring 会启动所有未针对任何配置文件的 beans 针对当前配置文件的 bean。在您的情况下,这会导致您的 2 个实现之间发生冲突。

我认为,如果你想使用配置文件,你应该至少定义 2 个:DevProd(名称只是为了举例。)

现在将 AccountListImp1 标记为 Prod 并将 AccountListImp2 标记为 Dev:

@Service
@Profile("Prod")
public AccountListImp1 interface AccountList { ... }
and some development implementation

@Service
@Profile("Dev")
public AccountListImp2 interface AccountList { ... }

我相信这个配置会起作用。祝你好运。我很高兴知道这是否有帮助。

关于java - 使用@PROFILE 管理一个 Spring 接口(interface)的两个或多个实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19333503/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com