Spring AOP表达式中访问修饰符的用途是什么?

Car*_*eon 5 java spring spring-aop

来自Spring doc:

6.2.3.4.例子

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

执行(modifiers-pattern? ret-type-pattern声明-type-pattern?name-pattern(param-pattern)throws-pattern?)

我可以看到修饰符模式?在哪里可以说公共,私人,受保护.它在同一份文件中说:

6.2.3.1.支持的切入点指示符

由于Spring的AOP框架基于代理的特性,受保护的方法根据定义不会被拦截,既不用于JDK代理(这不适用),也不用于CGLIB代理(这在技术上可行,但不建议用于AOP).因此,任何给定的切入点都只能与公共方法匹配!

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

art*_*tol 4

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

\n\n
\n

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

\n\n

请注意,切入点定义通常与任何拦截的方法匹配。如果切入点严格意义上是仅限公共的,\n 即使在具有通过代理的潜在非公共交互的 CGLIB 代理场景中,\n 也需要对其进行相应的定义。

\n\n

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

\n
\n\n

因此,请小心使用非公共访问修饰符,但您可以在某些情况下通过 cglib 代理使用它们。

\n