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

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- 深入淺出講解Spring框架中AOP及動(dòng)態(tài)代理的應(yīng)用
- Spring中AOP概念與兩種動(dòng)態(tài)代理模式原理詳解
- Spring AOP里的靜態(tài)代理和動(dòng)態(tài)代理用法詳解
- Spring AOP手動(dòng)實(shí)現(xiàn)簡(jiǎn)單動(dòng)態(tài)代理的代碼
- Spring AOP中的JDK和CGLib動(dòng)態(tài)代理哪個(gè)效率更高?
- Spring AOP注解失效的坑及JDK動(dòng)態(tài)代理
- spring基礎(chǔ)概念A(yù)OP與動(dòng)態(tài)代理理解
- Spring?AOP原理及動(dòng)態(tài)代理
相關(guān)文章
Hikari?數(shù)據(jù)庫(kù)連接池內(nèi)部源碼實(shí)現(xiàn)的小細(xì)節(jié)
這篇文章主要介紹了Hikari?數(shù)據(jù)庫(kù)連接池內(nèi)部源碼實(shí)現(xiàn)的小細(xì)節(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02
從零開(kāi)始Java實(shí)現(xiàn)Parser?Combinator
這篇文章主要為大家介紹了從零開(kāi)始Java實(shí)現(xiàn)Parser?Combinator過(guò)程及原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05
SpringCloud之LoadBalancer負(fù)載均衡服務(wù)調(diào)用過(guò)程
這篇文章主要介紹了SpringCloud之LoadBalancer負(fù)載均衡服務(wù)調(diào)用過(guò)程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-03-03
解決maven父子工程install的時(shí)候排除某些子模塊,讓子模塊不install問(wèn)題
在Maven父子工程中,如果希望某個(gè)子模塊不被安裝到本地倉(cāng)庫(kù),可以在該子模塊的`pom.xml`文件中添加以下配置: ```xml ... org.apache.maven.plugins maven-install-plugin 2.5.2 true2024-12-12

