Spring動(dòng)態(tài)代理實(shí)現(xiàn)日志功能詳解
代理模式(Proxy)是通過(guò)代理對(duì)象訪問(wèn)目標(biāo)對(duì)象,這樣可以在目標(biāo)對(duì)象基礎(chǔ)上增強(qiáng)額外的功能,如添加權(quán)限,訪問(wèn)控制和審計(jì)等功能。
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ù)接口實(shí)現(xiàn)類(lèi)
package com.haijiao12138.demo.spring.agentLog0815; /** * @author: haijiao12138 * @ClassName: BusinessClassServiceImpl * @description: 業(yè)務(wù)類(lèi) * @date: 2021/8/15 14:34 */public class BusinessClassServiceImpl implements BusinessClassService { //執(zhí)行某事 @Override public void doSomeThing() {System.out.println('doing somthing......'); }}
3.日志接口和實(shí)現(xiàn)類(lèi)
package com.haijiao12138.demo.spring.agentLog0815; import java.lang.reflect.Method; /** * @author: haijiao12138 * @ClassName: MyLogger * @description:日志類(lèi)接口 * @date: 2021/8/15 14:38 */public interface MyLogger { //記錄進(jìn)入方法時(shí)間 public void saveIntoMethodTime(Method method); //記錄退出方法的時(shí)間 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 日志實(shí)現(xiàn)類(lèi) * @date: 2021/8/15 14:40 */public class MyLoggerImpl implements MyLogger{ @Override public void saveIntoMethodTime(Method method) {System.out.println('進(jìn)入' + method.getName() +'方法時(shí)間為: ' + new Date()); } @Override public void saveOutMethodTime(Method method) {System.out.println('退出' + method.getName() + '方法時(shí)間為:' + new Date()); }}
4.下面是日志類(lèi)的handler實(shí)現(xiàn):
package com.haijiao12138.demo.spring.agentLog0815; import java.lang.reflect.Method;import java.util.Date; /** * @author: haijiao12138 * @ClassName: MyLoggerImpl * @description: TODO 日志實(shí)現(xiàn)類(lèi) * @date: 2021/8/15 14:40 */public class MyLoggerImpl implements MyLogger{ @Override public void saveIntoMethodTime(Method method) {System.out.println('進(jìn)入' + method.getName() +'方法時(shí)間為: ' + new Date()); } @Override public void saveOutMethodTime(Method method) {System.out.println('退出' + method.getName() + '方法時(shí)間為:' + new Date()); }}
5.測(cè)試類(lèi)
package com.haijiao12138.demo.spring.agentLog0815; import java.lang.reflect.Proxy; /** * @author: haijiao12138 * @ClassName: MyLoggerTest * @description: TODO 日志測(cè)試類(lèi) * @date: 2021/8/15 14:43 */public class MyLoggerTest { public static void main(String[] args) {/** 實(shí)例化真實(shí)項(xiàng)目中業(yè)務(wù)類(lèi) **/BusinessClassService businessClassService = new BusinessClassServiceImpl();/** 日志類(lèi)的handler **/MyLoggerHandler myLoggerHandler = new MyLoggerHandler(businessClassService);/** 獲得代理類(lèi)對(duì)象 **/BusinessClassService businessClass = (BusinessClassService) Proxy.newProxyInstance(businessClassService.getClass().getClassLoader(), businessClassService.getClass().getInterfaces(),myLoggerHandler);/** 執(zhí)行代理類(lèi)方法 **/businessClass.doSomeThing(); } }
結(jié)果輸出:
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。
相關(guān)文章:
1. HTML DOM setInterval和clearInterval方法案例詳解2. WML語(yǔ)言的基本情況3. 使用css實(shí)現(xiàn)全兼容tooltip提示框4. CSS hack用法案例詳解5. 低版本IE正常運(yùn)行HTML5+CSS3網(wǎng)站的3種解決方案6. css代碼優(yōu)化的12個(gè)技巧7. CSS3實(shí)例分享之多重背景的實(shí)現(xiàn)(Multiple backgrounds)8. 使用純HTML的通用數(shù)據(jù)管理和服務(wù)9. 告別AJAX實(shí)現(xiàn)無(wú)刷新提交表單10. css進(jìn)階學(xué)習(xí) 選擇符
