我正在尝试将
Spring上下文中定义的bean注入CDI托管组件,但我没有成功.不注入bean,而是每次执行注入时都会创建一个新实例.我的环境是使用JBoss Weld的Tomcat 7.
Spring ApplicationContext是直截了当的:
...
...
CDI托管bean看起来像这样:
@javax.inject.Named("testA")
public class TestA {
@javax.inject.Inject
private Test myTest = null;
...
public Test getTest() {
return this.myTest;
}
}
这是我的faces-config.xml
org.springframework.web.jsf.el.SpringBeanFacesELResolver
但是,当我从JSF页面访问test属性时,每次访问时都会创建一个新的Test实例.这是一个简单的例子:
...
1:
2:
...
我得到以下输出:
1: test.Test@44d79c75
2: test.Test@53f336eb
刷新后:
1: test.Test@44d79c75
2: test.Test@89f2ac63
我可以看到第一个输出是正确的.无论我多久刷新一次页面,testFromSpring都会返回Spring上下文中定义的bean的值.但是第二个输出清楚地表明,每次调用测试组件上的getTest方法时,都会创建并注入一个新的Test实例,而不是像我期望的那样使用Spring上下文中的实例.
那么,这种行为的原因是什么?
如何将Spring上下文中的bean注入CDI托管bean?
我也尝试使用在Spring上下文中定义的名称的限定符,但现在抛出一个异常,表明找不到bean:
org.jboss.weld.exceptions.DeploymentException: WELD-001408 Injection point has unsatisfied dependencies. Injection point: field test.TestA.myTest; Qualifiers: [@javax.inject.Named(value=testFromSpring)]
@javax.inject.Named("testA")
public class TestA {
@javax.inject.Inject
@javax.inject.Named("testFromSpring")
private Test myTest = null;