【问题标题】:Spring AOP Pointcut for Serializable可序列化的 Spring AOP 切入点
【发布时间】:2012-06-23 16:54:42
【问题描述】:

是否可以为 SpringBean Serializable 创建切入点?

我想用以下语法拦截我的控制器的 writeObject 和 readObject:

execution(* ((@org.springframework.stereotype.Controller java.io.Serializable)+).*(..))

我认为问题在于 readObject/writeObject 是私有的并且以不同的方式调用。有什么建议吗?

【问题讨论】:

    标签: java spring aop spring-aop serializable


    【解决方案1】:

    问题是:Spring AOP 无法匹配这些切入点。 Spring AOP 只匹配公共方法的切入点。您将需要 AspectJ 编译或 Load Time Weaving 才能使其工作。

    注意

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

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

    来源:8.2.3.1. Supported Pointcut Designators

    在你问之前:将方法公开也无济于事,因为它们将由 Java 序列化机制而不是由 Spring 调用,因此 Spring AOP 不知道发生了什么。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-01
      • 1970-01-01
      • 2018-06-13
      相关资源
      最近更新 更多