利用spring aop實現(xiàn)動態(tài)代理
下面由我來給大家展示用spring aop實現(xiàn)動態(tài)代理的例子(電腦打?。?/p>
下面就看一下具體的代碼:
先定義一個打印機的接口
package aop007_ComPrint;
public interface Print {
public void ColorPrint(); //彩色打印
public void WhitePrint(); //黑白打印
}
然后定義兩個實現(xiàn)類,分別實現(xiàn)彩色打印和黑白打印
package aop007_ComPrint;
public class ColorPrint implements Print {
@Override
public void ColorPrint() {
System.out.println("[核心業(yè)務(wù)邏輯]我是一臺彩色打印機!");
System.out.println("[核心業(yè)務(wù)邏輯]我主要負責(zé)打印彩色資料!");
}
@Override
public void WhitePrint() {
//System.out.println("[核心業(yè)務(wù)邏輯]我主要負責(zé)打印黑白資料!");
}
}
package aop007_ComPrint;
public class WhitePrint implements Print {
@Override
public void WhitePrint() {
System.out.println("[核心業(yè)務(wù)邏輯]我是一臺黑白打印機!");
System.out.println("[核心業(yè)務(wù)邏輯]我主要負責(zé)打印黑白資料!");
}
@Override
public void ColorPrint() {
//System.out.println("[核心業(yè)務(wù)邏輯]我主要負責(zé)打印彩色資料!");
}
}
再定義一個代理類PrintHandler 實現(xiàn)動態(tài)代理打印功能
package aop007_ComPrint;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.util.Date;
public class PrintHandler implements InvocationHandler {
//目標(biāo)類型不確定
private Object target;
public PrintHandler(Object target){
this.target = target;
}
/*
* return 返回的是原來目標(biāo)方法所返回的內(nèi)容 method 就是要執(zhí)行的方法
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
before();
// 具體的業(yè)務(wù)邏輯代碼
// Object returnPrintObj = targer.method //用于解釋下面一行代碼
Object returnPrintObj = method.invoke(target, args);
after();
return returnPrintObj;
}
private void before(){
// 前置任務(wù)
System.out.println(new Date());
System.out.println("打印機");
System.out.println("南方it學(xué)院提供!");
}
private void after(){
// 后置任務(wù)
System.out.println("學(xué)院打印機");
System.out.println("請好好愛護,弄壞你可賠不起的哦?。?!");
}
}
最后就定義一個測試類TestPrint 用于測試打印的功能
package aop007_ComPrint;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
/*
* 增加一個【動態(tài)代理類】,類似與明星的經(jīng)紀(jì)人
* 把核心的業(yè)務(wù)邏輯的代碼 和 非核心的 分離
* 把非核心的代碼交給經(jīng)紀(jì)人(proxy)去管理,
* 注意:經(jīng)紀(jì)人和要明星,必須實現(xiàn)同一個接口
*/
public class TestPrint {
public static void main(String[] args) {
//第一步:創(chuàng)建目標(biāo)實現(xiàn)類的實例
Print cPrint = new ColorPrint();
Print wPrint = new WhitePrint();
//第二步:創(chuàng)建一個動態(tài)代理類(CEO 首席執(zhí)行官)
InvocationHandler cPrintHandler = new PrintHandler(cPrint);
InvocationHandler wPrintHandler = new PrintHandler(wPrint);
//第三步:創(chuàng)建動態(tài)代理(跟靜態(tài)代理一樣,申明的變量仍然是目標(biāo)的接口)
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(); [只有核心代碼] 運行后的區(qū)別
System.out.println("------------------------------");
wPrintProxy.WhitePrint(); //對比 wPrint.WhitePrint(); [只有核心代碼] 運行后的區(qū)別
}
}
到這里就完了,運行結(jié)果如下所示:

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Hikari?數(shù)據(jù)庫連接池內(nèi)部源碼實現(xiàn)的小細節(jié)
這篇文章主要介紹了Hikari?數(shù)據(jù)庫連接池內(nèi)部源碼實現(xiàn)的小細節(jié),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-02-02
從零開始Java實現(xiàn)Parser?Combinator
這篇文章主要為大家介紹了從零開始Java實現(xiàn)Parser?Combinator過程及原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-05-05
SpringCloud之LoadBalancer負載均衡服務(wù)調(diào)用過程
這篇文章主要介紹了SpringCloud之LoadBalancer負載均衡服務(wù)調(diào)用過程,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2025-03-03
解決maven父子工程install的時候排除某些子模塊,讓子模塊不install問題
在Maven父子工程中,如果希望某個子模塊不被安裝到本地倉庫,可以在該子模塊的`pom.xml`文件中添加以下配置: ```xml ... org.apache.maven.plugins maven-install-plugin 2.5.2 true2024-12-12

