估计很多人都使用过动态代理,特别是处理事务时,动态代理是一个很好的解决方案,但是其中有一些注意点我们还是需要了解一下;
举例
伪代码如下:
UserService {
void a(){
this.b();
}
void b(){
}
}
OrderService {
UserService userService;
void a(){
userService.b();
}
}
加入UserService的方法a、方法b和OrderService的方法a都进行了动态代理,那么现在调用UserService的方法a和调用OrderService的方法a分别会走几层代理?为什么?
其实这个问题的答案UserService#a之后走一层方法a的代理,方法b的代理不会走;而OrderService#a则会走两层代理,方法a和方法b的代理都会走。因为UserService中的a方法中调用方法b使用的是this来调用,这时候的this指代的就是UserService对象自己,而OrderService中的a方法中调用方法b使用的是userService对象来调用,这时候的userService注入的其实是动态代理后的对象,所以会走b的代理。
其实这个问题和Spring事务管理的事务传播机制息息相关,大家可以思考一下……