5

来自Spring 文档

6.2.3.4。例子

Spring AOP 用户可能最常使用执行切入点指示符。执行表达式的格式为:

执行(修饰符模式? ret 类型模式声明类型模式?名称模式(参数模式)抛出模式?)

我可以看到修饰符模式?您可以说公共,私人,受保护的地方。在同一份文件中,它说:

6.2.3.1。支持的切入点指示符

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

我有点困惑,使用修饰符模式有什么意义?请举个例子?

4

2 回答 2

4

该文档现在已过时。最新的是https://docs.spring.io/spring-framework/docs/current/spring-framework-reference/core.html#aop-pointcuts-designators并说

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

请注意,切入点定义通常与任何拦截的方法匹配。如果切入点严格来说是只公开的,即使在 CGLIB 代理场景中,通过代理进行潜在的非公开交互,也需要相应地定义它。

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

所以要小心非公共访问修饰符,但你可以在某些情况下使用它们与 cglib 代理。

于 2012-08-06T07:41:47.523 回答
0

您使用与切入点声明相关的访问修饰符来控制切入点声明在应用程序中的可见位置。

切入点声明与常规 Java 方法具有相同的访问修饰符:

  1. public,切入点声明在您的整个应用程序方面都是可见的;
  2. 默认(未指定修饰符),切入点声明对同一包中的所有其他方面可见;
  3. 受保护,切入点声明仅对子方面可见;
  4. 私有的,切入点声明仅在声明的方面可见。
于 2012-08-06T06:12:02.087 回答