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

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

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

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

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

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

缘由:spring的事务是经过AopProxy实现的,底层用的是jdk的动态代理,insert2()方法的调用是经过this,而不是代理类,因此加强功能失效blog

怎么解决呢?请看个人另外一篇文章接口

相关文章
相关标签/搜索