您好,登錄后才能下訂單哦!
下面由我來給大家展示用spring aop實現動態代理的例子(電腦打印)
下面就看一下具體的代碼:
先定義一個打印機的接口
package aop007_ComPrint; public interface Print { public void ColorPrint(); //彩色打印 public void WhitePrint(); //黑白打印 }
然后定義兩個實現類,分別實現彩色打印和黑白打印
package aop007_ComPrint; public class ColorPrint implements Print { @Override public void ColorPrint() { System.out.println("[核心業務邏輯]我是一臺彩色打印機!"); System.out.println("[核心業務邏輯]我主要負責打印彩色資料!"); } @Override public void WhitePrint() { //System.out.println("[核心業務邏輯]我主要負責打印黑白資料!"); } }
package aop007_ComPrint; public class WhitePrint implements Print { @Override public void WhitePrint() { System.out.println("[核心業務邏輯]我是一臺黑白打印機!"); System.out.println("[核心業務邏輯]我主要負責打印黑白資料!"); } @Override public void ColorPrint() { //System.out.println("[核心業務邏輯]我主要負責打印彩色資料!"); } }
再定義一個代理類PrintHandler 實現動態代理打印功能
package aop007_ComPrint; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.util.Date; public class PrintHandler implements InvocationHandler { //目標類型不確定 private Object target; public PrintHandler(Object target){ this.target = target; } /* * return 返回的是原來目標方法所返回的內容 method 就是要執行的方法 */ @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { before(); // 具體的業務邏輯代碼 // Object returnPrintObj = targer.method //用于解釋下面一行代碼 Object returnPrintObj = method.invoke(target, args); after(); return returnPrintObj; } private void before(){ // 前置任務 System.out.println(new Date()); System.out.println("打印機"); System.out.println("南方it學院提供!"); } private void after(){ // 后置任務 System.out.println("學院打印機"); System.out.println("請好好愛護,弄壞你可賠不起的哦!!!"); } }
最后就定義一個測試類TestPrint 用于測試打印的功能
package aop007_ComPrint; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Proxy; /* * 增加一個【動態代理類】,類似與明星的經紀人 * 把核心的業務邏輯的代碼 和 非核心的 分離 * 把非核心的代碼交給經紀人(proxy)去管理, * 注意:經紀人和要明星,必須實現同一個接口 */ public class TestPrint { public static void main(String[] args) { //第一步:創建目標實現類的實例 Print cPrint = new ColorPrint(); Print wPrint = new WhitePrint(); //第二步:創建一個動態代理類(CEO 首席執行官) InvocationHandler cPrintHandler = new PrintHandler(cPrint); InvocationHandler wPrintHandler = new PrintHandler(wPrint); //第三步:創建動態代理(跟靜態代理一樣,申明的變量仍然是目標的接口) Print cPrintProxy = (Print) Proxy.newProxyInstance(cPrint.getClass().getClassLoader(), cPrint.getClass().getInterfaces(), cPrintHandler); Print wPrintProxy = (Print) Proxy.newProxyInstance(wPrint.getClass().getClassLoader(), wPrint.getClass().getInterfaces(), wPrintHandler); cPrintProxy.ColorPrint(); //對比 cPrint.ColorPrint(); [只有核心代碼] 運行后的區別 System.out.println("------------------------------"); wPrintProxy.WhitePrint(); //對比 wPrint.WhitePrint(); [只有核心代碼] 運行后的區別 } }
到這里就完了,運行結果如下所示:
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。