这是我的 xml 配置:
<bean id="diameterClient" class="com.rory.ptspsim.diameterclient.DiameterClient" scope="singleton" init-method="start">
<constructor-arg index="0"><value>${pcca.host}</value></constructor-arg>
<constructor-arg index="1"><value>${pcca.port}</value></constructor-arg>
<constructor-arg index="2" value="com.rory.djgx.message"/>
<constructor-arg index="3" value="com.rory.djgx.avp"/>
<constructor-arg index="4">
<list>
<ref bean="asrHandler"/>
<ref bean="aaaHandler"/>
<ref bean="ceaHandler"/>
<ref bean="dwaHandler"/>
<ref bean="staHandler"/>
</list>
</constructor-arg>
</bean>
<bean id="asrHandler" class="com.rory.ptspsim.messagereceivers.ASRHandler"/>
<bean id="aaaHandler" class="com.rory.ptspsim.messagereceivers.AAAHandler"/>
<bean id="ceaHandler" class="com.rory.ptspsim.messagereceivers.CEAHandler"/>
<bean id="dwaHandler" class="com.rory.ptspsim.messagereceivers.DWAHandler"/>
<bean id="staHandler" class="com.rory.ptspsim.messagereceivers.STAHandler"/>
这是 ASRHandler 类的开始:
public class ASRHandler implements DiameterMessageHandler
{
@Autowired
private DiameterClient diameterClient;
有人知道为什么这不起作用吗?我意识到处理程序类和 DiameterClient 类相互依赖,但我认为 Spring 已经解决了这个问题。
这是日志中的消息:
org.springframework.beans.factory.BeanCreationException:创建 ServletContext 资源中定义的名为“diameterClient”的 bean 时出错 [/WEB-INF/applicationContext.xml]:使用 key 设置构造函数参数时无法解析对 bean“asrHandler”的引用[0];嵌套异常是org.springframework.beans.factory.BeanCreationException:创建名称为“asrHandler”的bean时出错:资源依赖项注入(inject)失败;嵌套异常是org.springframework.beans.factory.BeanCurrentlyInCreationException:创建名为“diameterClient”的bean时出错:请求的bean当前正在创建中:是否存在无法解析的循环引用?
谢谢!
最佳答案
这肯定是一个循环依赖。您应该看到 BeanCurrentlyInCreationException
由 Spring 抛出。
Bean 已经被实例化时就不能被引用。问题是您正在使用构造函数注入(inject)来创建 bean。
我看到有两件事应该能够解决这个问题。
- 基于包名称
DiameterClient
我假设这是一个由您控制的类(class)。我建议 Autowiring 该类的所有依赖项,就像您的xxxHandler
一样。类。您甚至应该能够@Autowired
一个List<DiameterMessageHandler>
,Spring 将加载所有bean
将该接口(interface)实现到列表中。 - 在您的 Bean 上使用基于属性的注入(inject)(使用
constructor-arg
元素,而不是property
元素)。
编辑:
如果您的文件看起来像这样:
<bean id="diameterClient" class="com.rory.ptspsim.diameterclient.DiameterClient" scope="singleton" init-method="start"/>
<bean id="asrHandler" class="com.rory.ptspsim.messagereceivers.ASRHandler"/>
<bean id="aaaHandler" class="com.rory.ptspsim.messagereceivers.AAAHandler"/>
<bean id="ceaHandler" class="com.rory.ptspsim.messagereceivers.CEAHandler"/>
<bean id="dwaHandler" class="com.rory.ptspsim.messagereceivers.DWAHandler"/>
<bean id="staHandler" class="com.rory.ptspsim.messagereceivers.STAHandler"/>
还有这个:
public class DiameterClient {
@Autowired
private List<DiameterMessageHandler> handlers;
@Value("${pcca.host}")
private String host;
@Value("${pcca.port}")
private int port; // or String...
// I don't know what these other two would be...if they are autowired, or just values you would populate...
private String somePackage;
private String anotherPackage;
// methods go here...
}
然后是List<DiameterMessageHandler>
将包含您在 xml 中的diameterClient bean 下定义的 5 个 bean。如果顺序很重要,您可能需要在上下文中以特定顺序指定它们,但否则它应该可以正常工作。
关于java - Spring MVC @Autowire 不工作 - 循环依赖?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9433304/