先寫一個動態代理實現
1.寫接口類
2.寫真實對象,真實對象實現上面的接口
3.寫代理類,實現InvocationHandler接口,並重寫invoke方法spring
輸出結果以下ide
看b.work3()的輸出,只有work3經過代理對象(proxy)調用,因此「加入些額外的功能」
在work3()方法裏面的wor1()和work2調用,實際上是經過this(表明真實對象)調用的。
this.wor1(),this.work2表明的是真實對象的調用this
結論:只有代理對象調用的方法纔會被代理加強新功能
真實對象調用的方法不會被代理加強新功能代理
擴展:spring中的事務,爲何再同一類中方法調用同一個類中的另一個方法回失效?
如上圖:insert方法中調用insert2(),不管insert2的事務隔離級別定義的是哪種,insert2的事務都會失效,
insert2只會被看成insert中的執行代碼塊對象
緣由:spring的事務是經過AopProxy實現的,底層用的是jdk的動態代理,insert2()方法的調用是經過this,而不是代理類,因此加強功能失效blog
怎麼解決呢?請看個人另外一篇文章接口