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

