先写一个动态代理实现
1.写接口类
2.写真实对象,真实对象实现上面的接口
3.写代理类,实现InvocationHandler接口,并重写invoke方法
输出结果如下
看b.work3()的输出,只有work3通过代理对象(proxy)调用,所以“加入些额外的功能”
在work3()方法里面的wor1()和work2调用,其实是通过this(代表真实对象)调用的。
this.wor1(),this.work2代表的是真实对象的调用
结论:只有代理对象调用的方法才会被代理增强新功能
真实对象调用的方法不会被代理增强新功能
扩展:spring中的事务,为什么再同一类中方法调用同一个类中的另外一个方法回失效?
如上图:insert方法中调用insert2(),无论insert2的事务隔离级别定义的是哪一种,insert2的事务都会失效,
insert2只会被当作insert中的执行代码块
原因:spring的事务是通过AopProxy实现的,底层用的是jdk的动态代理,insert2()方法的调用是通过this,而不是代理类,所以增强功能失效
怎么解决呢?请看我的另一篇文章
来源:51CTO
作者:qq5e5f48e3af387
链接:https://blog.51cto.com/14743302/2483044