2013-04-16 37 views
1

我有一个接口的3个实现,并且为了实例化其中之一,我需要检查数据库中的参数。 我打算做工厂模式,但由于我在我的应用程序的其余部分使用JSF 2依赖注入,我想知道是否有一种方法可以做到这一点,是否有可能进行依赖注入dinamically? 我可以通过某种方式指出某个方法或某个方法来在每个时刻选择正确的实现吗? 对于后端我使用的是Spring核心,所以用Spring的上下文来做这件事的方法可行。jsf 2或spring 3中的动态依赖注入

我对所有内容都使用注解(Spring的@Autowired,JSF的@ManagedProperty)。

编辑:该项目将部署在Tomcat服务器上。

回答

1

我建议你在你的JSF项目中使用CDI,然后你可以使用编程注入。 您应该首先将CDI限定符添加到您的界面实现中(您将基本上为每个实现创建自定义注释 - tutorial)。然后,你可以使用像

@Named //similar to ManagedBean 
@RequestScoped 
public Bean { 

    @Inject 
    @Any 
    Instance<YourInterface> yourInterface; 

    public void someMethod() { 
     if(someCondition) { 
      InterfaceImpl impl = yourInterface.select(new SomeOfYourQualifiers()).get(); 
     } 
    }  
} 

Source

而且你不必赞成Inject使用Autowired。我也相信,有一些春天办法,我怎么到这一点,但会留下一些专家春天这里:-)

编辑

根据这一answer是真的有可能在Tomcat运行CDI 。你还会发现一些像这样的教程one。春季的方法可以使用AutowireCapableBeanFactor,但正如我所说,我不知道春天太多,所以这只是一个野性的猜测:-)

+1

Thanx的答案!我不能使用CDI,我们只允许使用Tomcat 6,并且据我所知它不支持CDI :(。 – parranz

+0

请参阅我的编辑请 –

+0

嗨,仍然无法将其更改为CDI,项目已经太大了,我们没有足够的时间:(我会等着看javax.faces.bean是否有办法做到这一点,如果没有,我会尝试AutowireCapableBeanFactory,它看起来很真实就像我们需要的一样,非常感谢! – parranz