1.靜態代理
代理類實現和目標類相同的接口,並持有接口的引用,通過接口的引用在自己的內部調用目標類的方法
2.動態代理
1.JDK動態代理
通過JDK的Proxy類的靜態方法newProxyIntance,可以在程序運行期間動態的生代理類
2.Cglib動態代理
需要引入Cglib.jar,不過spring-core中已經集成了此功能,所以不需要再額外引入jar包自定義一個代
理類實現MethodInterceptor接口,在invoke方法中可實現增強功能,調用時通過Enhancer類對其進行調用
代理模式的好處:
1.中介隔離的作用
在某些時候不能直接使用目標類或者不想直接使用目標類時,可以用代理的方式對目標類進行調用
2.開閉原則,增強功能
代理模式可以在代理類中對目標類的方法進行增強,添加緩存,日誌等功能
總結:
因靜態代理模式當接口每次改變時實現類都需要改變,並且當目標類因需求增加了方法時代理類也要做相應修改,維護
起來比較麻煩,故不推薦使用。
所以當目標類有實現接口時可以通過JDK動態代理實現代理模式,沒有接口時可以用Cglib實現。