CDI Bean访问Spring bean?

时间:2011-04-01 07:04:38

标签: spring jsf-2 cdi

我知道这听起来很奇怪,将CDI(Weld)和Spring混合为控制器。

但想象一下这种情况:

  1. 使用CDI,我可以使用@ConversationScoped,这是我的要求之一(到目前为止,我不知道我是否可以使用spring作为这种范围,因为如果可以的话,我可以用Spring,在faces-config.xml中使用el-resolver)
  2. 我的服务对象(@Service)和DAO(@Repository)将由Spring管理
  3. 现在出现的一个问题是,在我的控制器中,我如何访问我的服务对象?

    我觉得这样的事情不会起作用:

    @Named
    @ConversationScoped
    public class MyBean {
       @Named
       private SomeOtherBeanManagedByCDI myOtherBean; // this will work
    
       @Autowired
       private MySpringBean mySpringBean; // dont think that this will work
    
       ....
    }
    

    关于如何在cdi bean中使用spring bean的任何想法?谢谢!


    更新

    我刚刚从this article测试了解决方案,到目前为止一切正常,我感到宽慰。

    谢谢!

3 个答案:

答案 0 :(得分:5)

Rick Hightower编写了一个很好的扩展库,它支持将Spring bean注入CDI bean,反之亦然:

http://rick-hightower.blogspot.com/2011/04/cdi-and-spring-living-in-harmony.html

答案 1 :(得分:2)

OP中仍然有一个很好的接受答案和一些好的编辑,但我认为还有时间指出Seam Spring模块。

答案 2 :(得分:1)

此外,如果您尝试在一系列页面中管理状态,并希望对Struts或JSF或Spring MVC进行有效的会话管理,那么Spring Web Flow可以提供您所需要的内容,并提供流量范围内的bean在流量持续时间内生活,或多或少等同于Seam / CDI中的对话。如果您想要一个更长寿命的流量管理解决方案,Activiti SPring模块可以简化配置一些在过程范围内生存的bean,类似于Seam对jBPM的功能。