【问题标题】:What is the use of access modifiers in Spring AOP expression?Spring AOP 表达式中访问修饰符有什么用?
【发布时间】:2012-08-03 01:22:14
【问题描述】:

来自Spring doc

6.2.3.4。例子

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

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

我可以看到修饰符模式?在这里你可以说公共的、私人的、受保护的。在同一份文件上说:

6.2.3.1。支持的切入点指示符

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

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

【问题讨论】:

    标签: java spring spring-aop


    【解决方案1】:

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

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

    1. public,切入点声明在整个应用程序方面都是可见的;
    2. 默认(未指定修饰符),切入点声明对同一包中的所有其他方面可见;
    3. 受保护,切入点声明仅对子方面可见;
    4. private,切入点声明仅在声明的方面可见。

    【讨论】:

      【解决方案2】:

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

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

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

      如果你的拦截需要包括方法调用甚至构造函数 在目标类内部,考虑使用Spring驱动的native AspectJ weaving 代替 Spring 的基于代理的 AOP 框架。这 不同的AOP使用方式构成了不同的模式 特点,所以一定要让自己熟悉编织 在做出决定之前。

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

      【讨论】:

      • 您的意思是如果使用的 AOP 是基于代理的,则访问修饰符不适用?访问修饰符仅在您将 AOP 切换为加载/编译时编织时适用?
      • 这个答案不正确。使用访问修饰符是有道理的,因为它有助于通过访问修饰符过滤建议的方法,即@Pointcut(value = "execution(protected com.ex*..*.*(..))")
      • @fg78nc 如果您将 AspectJ 用于 AOP,这将有效,但如果您使用 Spring 的基于代理的 AOP,则无效。
      • 基于代理的 (CGLIB) Spring AOP 可以建议公共、受保护和默认(包私有)方法,因此它确实有所作为。
      • @fg78nc 谢谢,由于 Spring 的改进,我在 2012 年的回答不再正确。已更新。
      猜你喜欢
      • 2015-11-26
      • 2017-12-22
      • 2011-04-12
      • 2020-02-05
      • 2011-01-15
      • 2016-07-18
      • 2014-09-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多