是否可以为SpringBean Serializable创建切入点?
我想用语法拦截我的控制器的writeObject和readObject:
execution(* ((@org.springframework.stereotype.Controller java.io.Serializable)+).*(..))
我认为问题是readObject / writeObject是私有的,并以不同的方式调用。有什么建议吗?
答案 0 :(得分:4)
问题是:Spring AOP无法匹配这些切入点。 Spring AOP仅匹配公共方法的切入点。您需要使用AspectJ编译或加载时间编织才能使其正常工作。
注意强>
由于Spring的AOP框架基于代理的特性, 根据定义,受保护的方法不会被拦截,也不会被JDK拦截 代理(这不适用),也不代表CGLIB代理(其中 这在技术上是可行的,但不建议用于AOP目的)。 因此,任何给定的切入点都将与公众匹配 仅限方法!
如果您的拦截需要包括受保护/私有方法甚至 构造函数,考虑使用Spring驱动的原生AspectJ编织 而不是Spring的基于代理的AOP框架。这构成了一个 不同模式的AOP使用具有不同的特性,所以一定要确定 在做出决定之前先让自己熟悉编织。
来源:8.2.3.1. Supported Pointcut Designators
在您提出之前:将方法公开也无济于事,因为它们将由Java序列化机制调用,而不是由Spring调用,因此Spring AOP不知道发生了什么。