4

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

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

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

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

4

1 回答 1

4

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

笔记

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

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

来源:8.2.3.1。支持的切入点指示符

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

于 2012-06-21T12:46:11.783 回答