我们希望有两个实现生产和开发模式的接口:
考虑一个界面:
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应该可以解决我的问题。
答案 0 :(得分:8)
我认为您的问题是您的基类AccountListImp1
未标记为任何个人资料。我认为如果没有定义活动配置文件,那么将运行没有配置文件规范的bean,但是当您定义配置文件时,具有此类规范的bean将覆盖实现相同接口且没有配置文件定义的bean。这不起作用。
使用活动配置文件X
时,spring将启动所有未针对当前配置文件的任何配置文件和 bean的bean。在您的情况下,这会导致您的两个实现之间发生冲突。
我认为如果你想使用配置文件,你应该定义至少2:Dev
和Prod
(这些名称仅作为例子。)
现在将AccountListImp1
标记为Prod
,将AccountListImp2
标记为Dev
:
@Service
@Profile("Prod")
public AccountListImp1 interface AccountList { ... }
and some development implementation
@Service
@Profile("Dev")
public AccountListImp2 interface AccountList { ... }
我相信这种配置会起作用。祝好运。我很高兴知道这是否有用。