用于Serializable的Spring AOP切入点

时间:2012-06-21 12:44:01

标签: java spring aop spring-aop serializable

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

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

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

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

1 个答案:

答案 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不知道发生了什么。