使用@PROFILE管理一个Spring接口的两个或多个实现

时间:2013-10-12 11:12:47

标签: java spring

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

考虑一个界面:

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

1 个答案:

答案 0 :(得分:8)

我认为您的问题是您的基类AccountListImp1未标记为任何个人资料。我认为如果没有定义活动配置文件,那么将运行没有配置文件规范的bean,但是当您定义配置文件时,具有此类规范的bean将覆盖实现相同接口且没有配置文件定义的bean。这不起作用。

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

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

现在将AccountListImp1标记为Prod,将AccountListImp2标记为Dev

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

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

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