輕松掌握J(rèn)ava代理模式
和大家一起聊一聊java代理模式
1、靜態(tài)代理
1.1靜態(tài)代理的代理類和和被代理的類都要維護(hù)一個(gè)共同的接口。
public interface IUserDao { void save(); }
1.2被代理的類,目標(biāo)對(duì)象
public class UserDao implements IUserDao{ @Override public void save() { System.out.println("-----已經(jīng)保存數(shù)據(jù)?。?!------"); } }
1.3代理對(duì)象
public class UserDaoProxy implements IUserDao{ // 接收保存目標(biāo)對(duì)象 private IUserDao target; public UserDaoProxy(IUserDao target) { this.target = target; } @Override public void save() { System.out.println("開始事務(wù)..."); target.save(); // 執(zhí)行目標(biāo)對(duì)象的方法 System.out.println("提交事務(wù)..."); } }
1.4測(cè)試類
public class App { public static void main(String[] args) { // 目標(biāo)對(duì)象 IUserDao target = new UserDao(); // 代理 IUserDao proxy = new UserDaoProxy(target); proxy.save(); // 執(zhí)行的是,代理的方法 } }
2、動(dòng)態(tài)代理
2.1同樣的,動(dòng)態(tài)代理也需要完成一個(gè)接口。(同上)
2.2目標(biāo)對(duì)象也是相同的。
2.3只是在代理對(duì)象上有所不同
public class ProxyFactory { // 維護(hù)一個(gè)目標(biāo)對(duì)象 private Object target; public ProxyFactory(Object target){ this.target = target; } // 給目標(biāo)對(duì)象,生成代理對(duì)象 public Object getProxyInstance() { return Proxy.newProxyInstance( target.getClass().getClassLoader(), target.getClass().getInterfaces(), new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("開啟事務(wù)"); // 執(zhí)行目標(biāo)對(duì)象方法 Object returnValue = method.invoke(target, args); System.out.println("提交事務(wù)"); return returnValue; } }); } }
2.4測(cè)試類
public class App { public static void main(String[] args) { // 目標(biāo)對(duì)象 IUserDao target = new UserDao(); System.out.println(target.getClass()); // 給目標(biāo)對(duì)象,創(chuàng)建代理對(duì)象 IUserDao proxy = (IUserDao) new ProxyFactory(target).getProxyInstance(); System.out.println(proxy.getClass()); // 執(zhí)行方法 【代理對(duì)象】 proxy.save(); } }
3、cglib代理
3.1cglib代理不需要完成接口,只需要寫被代理的類和代理類即可,此處被代理類同1.2,所以不再編寫。
3.2代理類有所不同,用到cglib代理模式需要引用spring的核心框架包。
public class ProxyFactory implements MethodInterceptor{ // 維護(hù)目標(biāo)對(duì)象 private Object target; public ProxyFactory(Object target){ this.target = target; } // 給目標(biāo)對(duì)象創(chuàng)建代理對(duì)象 public Object getProxyInstance(){ //1. 工具類 Enhancer en = new Enhancer(); //2. 設(shè)置父類 en.setSuperclass(target.getClass()); //3. 設(shè)置回調(diào)函數(shù) en.setCallback(this); //4. 創(chuàng)建子類(代理對(duì)象) return en.create(); } @Override public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable { System.out.println("開始事務(wù)....."); // 執(zhí)行目標(biāo)對(duì)象的方法 Object returnValue = method.invoke(target, args); System.out.println("提交事務(wù)....."); return returnValue; } }
3.3測(cè)試類
public class App { public static void main(String[] args) { // 目標(biāo)對(duì)象 UserDao target = new UserDao(); System.out.println(target.getClass()); // 代理對(duì)象 UserDao proxy = (UserDao) new ProxyFactory(target).getProxyInstance(); System.out.println(proxy.getClass()); // 執(zhí)行代理對(duì)象的方法 proxy.save(); } }
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Java代理模式實(shí)例詳解【靜態(tài)代理與動(dòng)態(tài)代理】
- Java代理模式實(shí)例分析
- 23種設(shè)計(jì)模式(7) java代理模式
- Java代理模式詳細(xì)解析
- 輕松掌握J(rèn)ava代理模式
- java代理模式與動(dòng)態(tài)代理模式詳解
- Java基礎(chǔ)之讓你徹底搞懂代理模式
- Java通俗易懂系列設(shè)計(jì)模式之代理模式
- Java線程創(chuàng)建靜態(tài)代理模式代碼實(shí)例
- Java簡單實(shí)現(xiàn)動(dòng)態(tài)代理模式過程解析
- 淺談JAVA設(shè)計(jì)模式之代理模式
- Java設(shè)計(jì)模式之代理模式詳解
相關(guān)文章
java多線程中執(zhí)行多個(gè)程序的實(shí)例分析
在本篇文章里小編給大家整理的是一篇關(guān)于java多線程中執(zhí)行多個(gè)程序的實(shí)例分析內(nèi)容,有需要的朋友們可以學(xué)習(xí)參考下。2021-02-02學(xué)會(huì)CompletableFuture輕松駕馭異步編程
這篇文章主要為大家介紹了CompletableFuture輕松駕馭異步編程教程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04談?wù)勎覍?duì)Spring Bean 生命周期的理解
Spring Bean 的生命周期在整個(gè) Spring 中占有很重要的位置,掌握這些可以加深對(duì) Spring 的理解。這篇文章主要介紹了Spring Bean 生命周期,需要的朋友可以參考下2018-03-03idea推送項(xiàng)目到gitee中的創(chuàng)建方法
這篇文章主要介紹了idea推送項(xiàng)目到gitee中的創(chuàng)建方法,本文通過圖文實(shí)例相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-08-08Mybatis基于MapperScan注解的動(dòng)態(tài)代理加載機(jī)制詳解
這篇文章主要介紹了Mybatis基于MapperScan注解的動(dòng)態(tài)代理加載機(jī)制,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2023-01-01解決Shiro 處理ajax請(qǐng)求攔截登錄超時(shí)的問題
這篇文章主要介紹了解決Shiro 處理ajax請(qǐng)求攔截登錄超時(shí)的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09Java后端返回PDF預(yù)覽給前端的實(shí)現(xiàn)
前端要預(yù)覽服務(wù)器PDF 可直接將要blob流返回給前端,即可用瀏覽器自帶pdf預(yù)覽功能打開,本文就來介紹一下如何實(shí)現(xiàn),感興趣的可以了解一下2023-09-09IDEA創(chuàng)建Maven項(xiàng)目一直顯示正在加載的問題及解決
這篇文章主要介紹了IDEA創(chuàng)建Maven項(xiàng)目一直顯示正在加載的問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12