我需要知道如何在spring配置文件中动态注入依赖项。举个例子,我有一个名为“A类”的业务逻辑类。在该类中,它处理一个名为'doSomething()'的方法。 根据该应用,该方法可以以两种不同的方式执行(对于相同方法的两种类型的实现)。所以我用这个方法声明了一个名为'Manager'的接口,并为同一个接口创建了两个实现类。让我们称它们为'Impl1'和'Impl2',实现接口'Manager'。
Interface Manager{
void doSomething();
}
Class Impl1 implements Manager{
public void doSomething(){
//doIt like this way
}
Class Impl2 implements Manager{
public void doSomething(){
//doIt like that way
}
}
A类引用了名为“manager”的“Manager”接口,该接口将通过Spring DI在部署时设置。该注入可以是Impl1对象或Impl2对象。它将由最终用户决定。所以我必须为最终用户提供两个选项,他或她可以决定他或她想要处理这个'doSomething()'方法的方式,并根据他或她的选择我将注入相关的实现类(Impl1或Impl2) )。
Class A{
private Manager manager; //this can be either Impl1 or Impl2
public void setManager(Manager manager){
this.manager = manager;
}
public void performLogic(){
manager.doSomething();
}
}
最终用户只有一次机会做出选择,之后该应用程序将永远使用该实现,除非用户想要再次安装新的应用程序副本。如何根据用户在spring xml文件中的选择动态注入相关实现。处理这种情况的最佳方法是什么?欢迎提出意见。
提前全部谢谢!
答案 0 :(得分:5)
您需要使用Spring profiles。
使用两个配置文件,将每个实现包装到其中一个配置文件中。然后在启动时激活一个配置文件(例如,使用系统属性)。
答案 1 :(得分:1)
您认为如下所示:
Class A{
@Autowired
@Qualifier("Impl1")
private Manager manager1; // Impl1
@Autowired
@Qualifier("Impl1")
private Manager manager2; // Impl2
// getter setter for manager1 and manager2
public void performLogic(){
getUserChoiceManager().doSomething();
}
private Manager getUserChoiceManager() {
// return manager according to user choice
}
}