0

我在教程中遇到了以下 Spring AOP 切入点:

execution(public * * (..))

据说这会导致所有公共方法的执行。那是对的吗?AFAIK 我们只能拦截公共方法,而那里的公共关键字甚至是非法的。

4

3 回答 3

2

除了@Mario 的回答之外,AOP 上的 spring 文档还说以下(强调我的):

注意 由于 Spring 的 AOP 框架基于代理的性质,根据定义,受保护的方法不会被截获,对于 JDK 代理(如果不适用)和 CGLIB 代理(这在技术上可行但不推荐用于 AOP 目的)都不会被拦截. 因此,任何给定的切入点都只会与公共方法匹配!

如果您的拦截需求包括受保护/私有方法甚至构造函数,请考虑使用 Spring 驱动的原生 AspectJ 编织而不是 Spring 的基于代理的 AOP 框架。这就构成了具有不同特点的不同AOP使用模式,所以在做决定之前一定要先熟悉编织。

另外,切入点语法如下:

execution(modifiers-pattern? ret-type-pattern declaring-type-pattern?
          name-pattern(param-pattern) throws-pattern?)

Wherby the will modifier-patternbepublicprotected但是可选的...

于 2012-10-06T15:40:36.563 回答
1

是的,这似乎是一个有效的切入点,并且完全按照他所说的进行。

此外,值得注意的是,将“public”关键字替换为“protected”是完全合法的,并且仍然有效!奇怪的是,它也适用于“私有”方法......(使用 Spring 3.1.2 + AspectJ 1.6.9 测试)

据我所知,CGLib 代理可用于代理受保护的方法,但是它们只有在从不同的对象实例调用时才有效。所以从技术上讲,应该可以以与公共方法完全相同的方式为受保护方法提供建议。

(正如@beny23 所报告的,建议保护/私有方法不适用于 Spring AOP 代理实现,但仅适用于 Spring 驱动的 AspectJ 编织)

于 2012-10-06T15:35:27.497 回答
0

切入点:designator(modifier returnType package.type.method(params)) 在你的情况下

execution(public * * (..))

将为项目目录中具有任何返回类型的所有公共方法执行 0 到多个参数

于 2012-10-07T11:21:02.653 回答