spring配置文件中的动态依赖注入

时间:2013-03-07 09:44:15

标签: java xml spring java-ee dependency-injection

我需要知道如何在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对象。它将由最终用户决定。所以我必须为最终用户提供两个选项,他或她可以决定他或她想要处理这个'do​​Something()'方法的方式,并根据他或她的选择我将注入相关的实现类(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文件中的选择动态注入相关实现。处理这种情况的最佳方法是什么?欢迎提出意见。

提前全部谢谢!

2 个答案:

答案 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
 }
}