2013-03-07 83 views
1

我需要知道如何在spring配置文件中动态注入依赖。举个例子,我有一个叫做'A类'的业务逻辑类。在该类中,它处理一个名为“doSomething()”的方法。 根据应用程序,该方法可以以两种不同的方式执行(对于相同方法,两种类型的实现)。所以我用这个方法声明了一个名为'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类对“经理”接口的引用称为“经理”,它将在部署时通过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

只想说 - 解决方案使用@Profiles更可取 – 2013-03-07 11:38:59

+0

嗨,是的,但我觉得@profile更适合大规模。我只需要在两个类之间切换只为整个应用程序。所以我发现Nandkumar Tekale的回答很适合我的情况。 btw感谢您的支持! – 2013-03-07 11:45:29

回答

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 
} 
} 
+0

感谢Nandkumar Tekale为您的答案!我决定采用这个解决方案。非常感谢。 – 2013-03-07 11:36:34

5

您需要使用Spring profiles

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

+0

感谢您的回答!我找到了另一种方法来做到这一点。检查接受的答案。 – 2013-03-07 11:38:54

+1

是的,但在Qualifier解决方案的情况下,您的应用程序将创建并处理2个bean。在配置文件的情况下 - 只有一个需要。 – 2013-03-07 11:40:06

+5

你可能已经采用了另一种方法,但这并不能回答这个问题,因为它不是“动态”的。那个给你两个静态实例,每个管理器类型一个。 [用于@Qualifier的字符串甚至不能是环境变量或任何灵活的东西。] Spring配置文件可能不是您的实现选择,但它是您的问题的答案。 – JoeG 2013-04-03 20:07:25