Spring動(dòng)態(tài)代理實(shí)現(xiàn)日志功能詳解
代理模式(Proxy)是通過代理對(duì)象訪問目標(biāo)對(duì)象,這樣可以在目標(biāo)對(duì)象基礎(chǔ)上增強(qiáng)額外的功能,如添加權(quá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)類
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.日志接口和實(shí)現(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)入方法時(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)類 * @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.下面是日志類的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)類 * @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è)試類
package com.haijiao12138.demo.spring.agentLog0815; import java.lang.reflect.Proxy; /** * @author: haijiao12138 * @ClassName: MyLoggerTest * @description: TODO 日志測(cè)試類 * @date: 2021/8/15 14:43 */public class MyLoggerTest { public static void main(String[] args) {/** 實(shí)例化真實(shí)項(xiàng)目中業(yè)務(wù)類 **/BusinessClassService businessClassService = new BusinessClassServiceImpl();/** 日志類的handler **/MyLoggerHandler myLoggerHandler = new MyLoggerHandler(businessClassService);/** 獲得代理類對(duì)象 **/BusinessClassService businessClass = (BusinessClassService) Proxy.newProxyInstance(businessClassService.getClass().getClassLoader(), businessClassService.getClass().getInterfaces(),myLoggerHandler);/** 執(zhí)行代理類方法 **/businessClass.doSomeThing(); } }
結(jié)果輸出:

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。
相關(guān)文章:
1. Android table布局開發(fā)實(shí)現(xiàn)簡(jiǎn)單計(jì)算器2. 理解PHP5中static和const關(guān)鍵字3. jQuery 實(shí)現(xiàn)DOM元素拖拽交換位置的實(shí)例代碼4. php模擬實(shí)現(xiàn)斗地主發(fā)牌5. IntelliJ IDEA安裝插件的方法步驟6. phpstorm恢復(fù)默認(rèn)設(shè)置的方法步驟7. Vue封裝一個(gè)TodoList的案例與瀏覽器本地緩存的應(yīng)用實(shí)現(xiàn)8. Python random庫使用方法及異常處理方案9. Vuex localStorage的具體使用10. .Net Core使用Coravel實(shí)現(xiàn)任務(wù)調(diào)度的完整步驟

網(wǎng)公網(wǎng)安備