10

我们希望对生产和开发模式的接口有两种实现:

考虑一个接口:

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 应该可以解决我的问题。

4

1 回答 1

10

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

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

我认为,如果您想使用配置文件,您应该至少定义 2:DevProd(这些名称仅作为示例。)

现在标记AccountListImp1ProdAccountListImp2Dev

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

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

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

于 2013-10-12T11:37:20.103 回答