1

我需要知道如何在 spring 配置文件中动态注入依赖项。例如,我有一个名为“A 类”的业务逻辑类。在该类中,它处理一个名为“doSomething()”的方法。根据应用程序,此方法可以以两种不同的方式执行(同一方法的两种类型的实现)。所以我用这个方法声明了一个名为“Manager”的接口,并为同一个接口创建了两个实现类。让我们称它们为实现接口“Manager”的“Impl1”和“Impl2”。

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文件中的选择动态注入相关实现。处理这种情况的最佳方法是什么?欢迎提出想法。

提前谢谢大家!

4

2 回答 2

5

您需要使用Spring 配置文件

使用两个配置文件,将每个实现包装到其中一个。然后在开始时激活配置文件之一(例如使用系统属性)。

于 2013-03-07T09:55:18.563 回答
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
 }
}
于 2013-03-07T09:53:32.167 回答