嗨,我有以下短代码:
https://github.com/shmuel-buchnik/scope-issue
我得到以下错误:
"bean类[C]的属性'targetBeanName'无效:bean属性'targetBeanName'不可写或具有无效的setter方法。setter的参数类型与getter的返回类型匹配吗?"
我会很乐意理解的方式。
提前谢谢。
添加上下文文件以保存对github 的访问
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
<bean name="a" class="A">
<property name="action" ref="c"/>
</bean>
<bean name="b" class="B" scope="prototype">
<property name="d" ref="d"/>
<aop:scoped-proxy proxy-target-class="false"/>
</bean>
<bean name="c" class="C" parent="b" scope="prototype">
<aop:scoped-proxy proxy-target-class="false"/>
</bean>
<bean name="d" class="D"/>
</beans>
经过调试,这就是问题所在:
当您在spring中定义父级时,这意味着您希望继承父级bean配置。
当您定义作用域代理时,代理bean拥有两个属性targetBeanName和ProxyTargetClass。
当您继承一个作为作用域代理的bean时,您可以将这些属性作为合并父bean配置的一部分。然后,您的bean尝试找到一个用于设置属性的setter并引发异常。
这意味着在我们的例子中,即使c不是作用域代理,我们仍然会得到异常。
如果bean定义配置为<aop:scoped-proxy>
,则不能将bean定义用作父级。
因此,只需删除b
bean的<aop:scoped-proxy>
声明,它就可以工作了。