作用域代理和父级的组合

Combination of scope-proxy and parent

您好,我有以下短代码:

https://github.com/shmuel-buchnik/scope-issue

我收到以下错误:

"Invalid property 'targetBeanName' of bean class [C]: Bean property 'targetBeanName' is not writable or has an invalid setter method. Does the parameter type of the setter match the return type of the 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 配置。

当您定义范围代理时,代理 bean 拥有两个属性 targetBeanName 和 ProxyTargetClass。

当您继承一个作为范围代理的 bean 时,您将获得这些属性作为合并父 bean 配置的一部分。然后您的 bean 会尝试找到一个 setter 来设置 属性 并引发异常。

这意味着在我们的示例中,即使 c 不是作用域代理,我们仍然会遇到异常。

如果 bean 定义配置为 <aop:scoped-proxy>.

,则不能将 bean 定义用作 parent

因此,只需删除 b bean 的 <aop:scoped-proxy> 声明,它就会起作用。