利用spring aop實(shí)現(xiàn)動態(tài)代理
下面由我來給大家展示用spring aop實(shí)現(xiàn)動態(tài)代理的例子(電腦打?。?/p>
下面就看一下具體的代碼:
先定義一個打印機(jī)的接口
package aop007_ComPrint;
public interface Print {
public void ColorPrint(); //彩色打印
public void WhitePrint(); //黑白打印
}
然后定義兩個實(shí)現(xiàn)類,分別實(shí)現(xiàn)彩色打印和黑白打印
package aop007_ComPrint;
public class ColorPrint implements Print {
@Override
public void ColorPrint() {
System.out.println("[核心業(yè)務(wù)邏輯]我是一臺彩色打印機(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ù)邏輯]我是一臺黑白打印機(jī)!");
System.out.println("[核心業(yè)務(wù)邏輯]我主要負(fù)責(zé)打印黑白資料!");
}
@Override
public void ColorPrint() {
//System.out.println("[核心業(yè)務(wù)邏輯]我主要負(fù)責(zé)打印彩色資料!");
}
}
再定義一個代理類PrintHandler 實(shí)現(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("打印機(jī)");
System.out.println("南方it學(xué)院提供!");
}
private void after(){
// 后置任務(wù)
System.out.println("學(xué)院打印機(jī)");
System.out.println("請好好愛護(hù),弄壞你可賠不起的哦?。?!");
}
}
最后就定義一個測試類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ì)人和要明星,必須實(shí)現(xiàn)同一個接口
*/
public class TestPrint {
public static void main(String[] args) {
//第一步:創(chuàng)建目標(biāo)實(shí)現(xiàn)類的實(shí)例
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(); [只有核心代碼] 運(yùn)行后的區(qū)別
System.out.println("------------------------------");
wPrintProxy.WhitePrint(); //對比 wPrint.WhitePrint(); [只有核心代碼] 運(yùn)行后的區(qū)別
}
}
到這里就完了,運(yùn)行結(jié)果如下所示:

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot中驗(yàn)證用戶上傳的圖片資源的方法
這篇文章主要介紹了在SpringBoot中驗(yàn)證用戶上傳的圖片資源,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-09-09
MyBatis查詢數(shù)據(jù)庫語句總結(jié)
MyBatis是一種持久化框架,可以與許多不同類型的關(guān)系型數(shù)據(jù)庫連接,下面這篇文章主要給大家介紹了關(guān)于MyBatis查詢數(shù)據(jù)庫語句的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-06-06
IDEA中Java出現(xiàn)無效的源發(fā)行版錯誤的解決辦法
這篇文章主要給大家介紹了關(guān)于IDEA中Java出現(xiàn)無效的源發(fā)行版錯誤的解決辦法,IDEA中Java出現(xiàn)?效的源發(fā)?版解決辦法出現(xiàn)該問題的原因是項(xiàng)?Project當(dāng)中的jdk與電腦當(dāng)中的jdk版本不?致造成的,需要的朋友可以參考下2023-10-10
解決SpringBoot使用@Value獲取不到y(tǒng)aml中配置值的問題
在最近的開發(fā)中遇到一個問題,使用@Value獲取yml文件中配置的屬性時始終獲取不到值,所以本文給大家詳細(xì)介紹了SpringBoot使用@Value獲取不到y(tǒng)aml中值的問題分析及解決方法,需要的朋友可以參考下2024-01-01
使用SpringBoot中的Schedule定時發(fā)送郵件的方法
在SpringBoot中,你可以使用@Scheduled注解來創(chuàng)建定時任務(wù),@Scheduled注解可以應(yīng)用于方法上,表示這個方法是一個定時任務(wù),可以根據(jù)指定的時間間隔或固定時間執(zhí)行,本文就給大家介紹一下如何使用SpringBoot中的Schedule定時發(fā)送郵件,需要的朋友可以參考下2023-08-08
Java實(shí)例項(xiàng)目零錢通的實(shí)現(xiàn)流程
本篇文章為你帶來Java的一個新手實(shí)戰(zhàn)項(xiàng)目,是一個零錢通系統(tǒng),項(xiàng)目來自于B站韓順平老師,非常適合新手入門練習(xí),感興趣的朋友快來看看吧2022-03-03

