aspectj中call和execute在spring架构中的重要区别

在使用aspectj进行定义pointcut时,经常碰到的问题就是该使用call还是execute。当然,在spring中,只支持execute,而不支持call,但使用aspectj如ltw时就可以使用,但两者究竟有什么区别,最大的区别在哪儿,适用点又在哪儿。这就要从定义出来,来了解相关信息了。

在文档《aspectj_in_action_second_editon.pdf》中,针对二者,主要如下面所述:

a call is on the caller side, whereas execution happens on the receiver side—they’re two completely different places. 

即call工作在调用端,而execute工作在被调用端。
如我们将在pointcut打印一句helloworld。那么针对helloAction调用helloService而言。针对call调用,这句打印将会在helloAction中调用,而execute调用,而是在helloService中调用。

以上只是表面上的区别,在具体使用时其实并不是太大的差别,但如果有以下一句话,那么区别就可能完全不一样了:

aspectj是通过修改字节码来完成相应的功能,通过在相应的pointcut定义指定的advice来完成功能。

具体点说,就是aspectj首先需要能够匹配到相应的pointcut,然后才能执行相应的advice方法,如果不能匹配到pointcut,那么就不能执行相应的方法。

继续阅读“aspectj中call和execute在spring架构中的重要区别”

Spring中对于代理类子类实例化时的代理创建问题

     在spring中,通常在进行事务处理时,我们都会写如一段事务配置文件来保证相应的service类被代理成受事务控制的。那么对于那些没有配置成事务的Service,spring是否也会创建相应的代理类,并且在某些方法上也会追加相应的事务呢。

继续阅读“Spring中对于代理类子类实例化时的代理创建问题”