为什么Spring AOP不拦截受保护的方法

时间:2014-04-04 11:29:27

标签: java spring proxy spring-aop protected

我熟悉Spring AOP。正如我在春季文档http://docs.spring.io/spring/docs/3.1.x/spring-framework-reference/html/aop.html中所读到的那样,Spring AOP致力于代理的概念。

8.2.3.1支持的切入点指示符部分中,我找到了以下注释

  

由于Spring的AOP框架基于代理的特性,受到保护   根据定义,方法既不被拦截,也不用于JDK代理   (这不适用)也不适用于CGLIB代理(如果是这样的话)   技术上可行,但不建议用于AOP目的)。作为一个   结果,任何给定的切入点都将与公共方法相匹配   只有!

起初,我并不相信它,所以我试图在没有使用接口的情况下实现它,默认情况下所有方法都是公开的,并且对上述情况感到惊讶。由于代理类是建议/目标对象的子类,受保护的方法可以由子类访问,所以我认为受保护的方法可以正常工作。

有人可以告诉我为什么不拦截受保护的方法吗?我错过了什么吗?

2 个答案:

答案 0 :(得分:1)

事实上,在去年春天的文档中,显然可以使用cglib

  

由于Spring的AOP框架基于代理的特性,目标对象内的调用根据定义不会被截获。对于JDK代理,只能拦截代理上的公共接口方法调用。使用CGLIB,代理上的公共和受保护方法调用将被拦截,甚至包括必要的包可见方法。但是,通过代理进行的常见交互应始终通过公共签名进行设计。

因为他们提到公共和包可见都包含在cglib的使用中,尝试使用latests spring版本,他们可以相应地更新这些东西

检查 here

答案 1 :(得分:0)

JDK代理基于接口,这意味着所有实现的方法都是公共的