是否可以为 SpringBean Serializable 创建一个切入点?
我想使用以下语法拦截控制器的 writeObject 和 readObject:
execution(* ((@org.springframework.stereotype.Controller java.io.Serializable)+).*(..))
我认为问题是 readObject/writeObject 是私有的并且以不同的方式调用。有什么建议吗?
是否可以为 SpringBean Serializable 创建一个切入点?
我想使用以下语法拦截控制器的 writeObject 和 readObject:
execution(* ((@org.springframework.stereotype.Controller java.io.Serializable)+).*(..))
我认为问题是 readObject/writeObject 是私有的并且以不同的方式调用。有什么建议吗?
问题是:Spring AOP 将无法匹配这些切入点。Spring AOP 只匹配公共方法的切入点。您将需要 AspectJ 编译或 Load Time Weaving 才能使其工作。
笔记
由于 Spring 的 AOP 框架基于代理的性质,根据定义,受保护的方法不会被截获,对于 JDK 代理(这不适用)和 CGLIB 代理(这在技术上可行但不推荐用于 AOP 目的)都是如此。 因此,任何给定的切入点都只会与公共方法匹配!
如果您的拦截需求包括受保护/私有方法甚至构造函数,请考虑使用 Spring 驱动的本机 AspectJ 编织而不是 Spring 的基于代理的 AOP 框架。这就构成了具有不同特点的不同AOP使用模式,所以在做决定之前一定要先熟悉编织。
在你问之前:将方法公开也无济于事,因为它们将由 Java 序列化机制调用,而不是由 Spring 调用,因此 Spring AOP 不知道发生了什么。