JDK动态代理你所不知道的事情

百般思念 提交于 2020-03-31 10:29:30

先写一个动态代理实现
1.写接口类
JDK动态代理你所不知道的事情
2.写真实对象,真实对象实现上面的接口
JDK动态代理你所不知道的事情
3.写代理类,实现InvocationHandler接口,并重写invoke方法
JDK动态代理你所不知道的事情

输出结果如下
JDK动态代理你所不知道的事情

看b.work3()的输出,只有work3通过代理对象(proxy)调用,所以“加入些额外的功能”
在work3()方法里面的wor1()和work2调用,其实是通过this(代表真实对象)调用的。
this.wor1(),this.work2代表的是真实对象的调用

结论:只有代理对象调用的方法才会被代理增强新功能
真实对象调用的方法不会被代理增强新功能

扩展:spring中的事务,为什么再同一类中方法调用同一个类中的另外一个方法回失效?
JDK动态代理你所不知道的事情
如上图:insert方法中调用insert2(),无论insert2的事务隔离级别定义的是哪一种,insert2的事务都会失效,
insert2只会被当作insert中的执行代码块

原因:spring的事务是通过AopProxy实现的,底层用的是jdk的动态代理,insert2()方法的调用是通过this,而不是代理类,所以增强功能失效

怎么解决呢?请看我的另一篇文章

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!