使用MethodInterceptor包含对protected方法的调用

时间:2014-03-31 15:49:24

标签: spring spring-aop aopalliance

我想使用基于XML的Spring配置来包装对第三方类中的受保护方法的调用。我已经联系了org.springframework.aop.support的一些春季课程。它适用于公共方法,但对于受保护的方法则失败:

<bean id="sampleAutoProxyCreator" class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<property name="proxyTargetClass" value="true" />
<property name="beanNames">
    <list>
        <value>thrirdPartyBean</value>
    </list>
</property>
<property name="interceptorNames">
    <list>
        <value>sampleAdvisor</value>
    </list>
</property>
</bean>
<bean id="sampleMethodNamePointcut" class="org.springframework.aop.support.NameMatchMethodPointcut">
    <property name="mappedNames">
        <list>
            <value>publicMethodThatWorks</value>
            <value>protectedMethodThatDoesNotWork</value>
        </list>
    </property>
</bean>
<bean id="sampleAdvice" class="sample.MyMethodInterceptor" />
<bean id="sampleAdvisor" class="org.springframework.aop.support.DefaultPointcutAdvisor">
    <property name="pointcut" ref="sampleMethodNamePointcut" />
    <property name="advice" ref="sampleAdvice" />
</bean>

如何调整此方法以使用受保护的方法?

1 个答案:

答案 0 :(得分:0)

正如评论中的linked question/answer所述,Springs AOP代理只能应用于public方法。

使用JDK代理,这是不可能的,因为代理只有您的目标对象的接口类型,因此您只能通过其public方法与它进行交互(请记住,所有方法都在界面为public)。

使用GGLIB代理,因为代理确实具有目标对象的类类型,所以您可以与其protected方法进行交互。我认为,由于代理机制之间的一致性原因,他们不允许这样做。