Spring動態(tài)代理實現(xiàn)日志功能詳解
代理模式(Proxy)是通過代理對象訪問目標(biāo)對象,這樣可以在目標(biāo)對象基礎(chǔ)上增強(qiáng)額外的功能,如添加權(quán)限,訪問控制和審計等功能。
1.自定義業(yè)務(wù)接口
package com.haijiao12138.demo.spring.agentLog0815; /** * @author: haijiao12138 * @ClassName: BusinessClassService * @description: TODO * @date: 2021/8/15 14:33 */public interface BusinessClassService { public void doSomeThing();//自定義接口 }
2.自定義業(yè)務(wù)接口實現(xiàn)類
package com.haijiao12138.demo.spring.agentLog0815; /** * @author: haijiao12138 * @ClassName: BusinessClassServiceImpl * @description: 業(yè)務(wù)類 * @date: 2021/8/15 14:34 */public class BusinessClassServiceImpl implements BusinessClassService { //執(zhí)行某事 @Override public void doSomeThing() {System.out.println('doing somthing......'); }}
3.日志接口和實現(xiàn)類
package com.haijiao12138.demo.spring.agentLog0815; import java.lang.reflect.Method; /** * @author: haijiao12138 * @ClassName: MyLogger * @description:日志類接口 * @date: 2021/8/15 14:38 */public interface MyLogger { //記錄進(jìn)入方法時間 public void saveIntoMethodTime(Method method); //記錄退出方法的時間 public void saveOutMethodTime(Method method);}
package com.haijiao12138.demo.spring.agentLog0815; import java.lang.reflect.Method;import java.util.Date; /** * @author: haijiao12138 * @ClassName: MyLoggerImpl * @description: TODO 日志實現(xiàn)類 * @date: 2021/8/15 14:40 */public class MyLoggerImpl implements MyLogger{ @Override public void saveIntoMethodTime(Method method) {System.out.println('進(jìn)入' + method.getName() +'方法時間為: ' + new Date()); } @Override public void saveOutMethodTime(Method method) {System.out.println('退出' + method.getName() + '方法時間為:' + new Date()); }}
4.下面是日志類的handler實現(xiàn):
package com.haijiao12138.demo.spring.agentLog0815; import java.lang.reflect.Method;import java.util.Date; /** * @author: haijiao12138 * @ClassName: MyLoggerImpl * @description: TODO 日志實現(xiàn)類 * @date: 2021/8/15 14:40 */public class MyLoggerImpl implements MyLogger{ @Override public void saveIntoMethodTime(Method method) {System.out.println('進(jìn)入' + method.getName() +'方法時間為: ' + new Date()); } @Override public void saveOutMethodTime(Method method) {System.out.println('退出' + method.getName() + '方法時間為:' + new Date()); }}
5.測試類
package com.haijiao12138.demo.spring.agentLog0815; import java.lang.reflect.Proxy; /** * @author: haijiao12138 * @ClassName: MyLoggerTest * @description: TODO 日志測試類 * @date: 2021/8/15 14:43 */public class MyLoggerTest { public static void main(String[] args) {/** 實例化真實項目中業(yè)務(wù)類 **/BusinessClassService businessClassService = new BusinessClassServiceImpl();/** 日志類的handler **/MyLoggerHandler myLoggerHandler = new MyLoggerHandler(businessClassService);/** 獲得代理類對象 **/BusinessClassService businessClass = (BusinessClassService) Proxy.newProxyInstance(businessClassService.getClass().getClassLoader(), businessClassService.getClass().getInterfaces(),myLoggerHandler);/** 執(zhí)行代理類方法 **/businessClass.doSomeThing(); } }
結(jié)果輸出:
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。
相關(guān)文章:
1. ASP.NET MVC使用正則表達(dá)式驗證手機(jī)號碼2. ASP.NET MVC把數(shù)據(jù)庫中枚舉項的數(shù)字轉(zhuǎn)換成文字3. SpringMVC+Jquery實現(xiàn)Ajax功能4. 基于javaweb+jsp實現(xiàn)企業(yè)財務(wù)記賬管理系統(tǒng)5. .Net Core 配置文件讀取IOptions,IOptionsMonitor,IOptionsSnapshot6. ASP新手必備的基礎(chǔ)知識7. Python數(shù)據(jù)庫格式化輸出文檔的思路與方法8. python中%格式表達(dá)式實例用法9. XML基本概念XPath、XSLT與XQuery函數(shù)介紹10. Python接口測試get請求過程詳解
