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)類
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í)有所幫助,也希望大家多多支持腳本之家。
- Spring AOP注解失效的坑及JDK動(dòng)態(tài)代理
- 詳解Spring的兩種代理方式:JDK動(dòng)態(tài)代理和CGLIB動(dòng)態(tài)代理
- spring基礎(chǔ)概念A(yù)OP與動(dòng)態(tài)代理理解
- Spring靜態(tài)代理和動(dòng)態(tài)代理代碼詳解
- Spring BPP中如何優(yōu)雅的創(chuàng)建動(dòng)態(tài)代理Bean詳解
- Spring AOP手動(dòng)實(shí)現(xiàn)簡(jiǎn)單動(dòng)態(tài)代理的代碼
- Spring Boot 日志配置方法(超詳細(xì))
- springboot整合mybatis將sql打印到日志的實(shí)例詳解
- SpringBoot通過(guò)yml和xml文件配置日志輸出方法
- 在Spring Boot中如何使用log4j記錄日志
相關(guān)文章

mybatis?一對(duì)多映射?column屬性的注意事項(xiàng)說(shuō)明

java如何實(shí)現(xiàn)圖片轉(zhuǎn)化為數(shù)據(jù)流

scala當(dāng)中的文件操作和網(wǎng)絡(luò)請(qǐng)求的實(shí)現(xiàn)方法

Java使用泛型實(shí)現(xiàn)棧結(jié)構(gòu)的示例代碼

Java消息隊(duì)列RabbitMQ之消息回調(diào)詳解