【问题标题】:Dynamic dependency injection in jsf 2 or spring 3jsf 2 或 spring 3 中的动态依赖注入
【发布时间】:2013-04-08 20:22:17
【问题描述】:

我有 3 个接口的实现,为了实例化其中一个,我需要从数据库中检查一个参数。 我打算用工厂模式来做,但是因为我在我的应用程序的其余部分使用 JSF 2 依赖注入,所以我想知道是否 有一种方法可以做到这一点,是否可以动态地进行依赖注入? 我可以以某种方式指出一种方法或某种东西来在每个时刻获取正确的实现吗? 对于后端,我使用的是弹簧核心,因此可以使用弹簧上下文来实现这一点。

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

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

【问题讨论】:

    标签: spring jsf dependency-injection


    【解决方案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

    您也不必使用Autowired 来支持Inject。我也确信有一些 Spring 方法可以做到这一点,但我会在这里把它留给一些 Spring 专家:-)

    编辑

    根据这个answer真的可以在Tomcat上运行CDI。您还将找到一些类似one 的教程。 Spring 方法可以使用AutowireCapableBeanFactor,但正如我所说,我不太了解 Spring,所以它只是一个疯狂的猜测:-)

    【讨论】:

    • 感谢您的回答!但是我不能使用 CDI,我们只能使用 Tomcat 6,据我所知它不支持 CDI :(.
    • 嗨,还是不能改成CDI,项目已经太大了,我们没有足够的时间:(。我等着看有没有办法做到这一点javax.faces.bean,如果没有,我会尝试 AutowireCapableBeanFactory,它看起来确实是我们需要的。非常感谢!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-06
    • 2011-07-07
    • 2012-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多