代理模式(Proxy)是通过代理对象访问目标对象,这样可以在目标对象基础上增强额外的功能,如添加权限,访问控制和审计等功能。
1.自定义业务接口
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-自定义业务接口实现类
package com.haijiao12138.demo.spring.agentLog0815;
/**
* @author: haijiao12138
* @ClassName: BusinessClassServiceImpl
* @description: 业务类
* @date: 2021/8/15 14:34
*/
public class BusinessClassServiceImpl implements BusinessClassService {
//执行某事
@Override
public void doSomeThing() {
System.out.println("doing somthing......");
}
}
3-日志接口和实现类
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 {
//记录进入方法时间
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 日志实现类
* @date: 2021/8/15 14:40
*/
public class MyLoggerImpl implements MyLogger{
@Override
public void saveIntoMethodTime(Method method) {
System.out.println("进入" + method.getName() +"方法时间为: " + new Date());
}
@Override
public void saveOutMethodTime(Method method) {
System.out.println("退出" + method.getName() + "方法时间为:" + new Date());
}
}
4-.下面是日志类的handler实现:
package com.haijiao12138.demo.spring.agentLog0815;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
/**
* @author: haijiao12138
* @ClassName: MyLoggerHandler
* @description: TODO 日志类MyLoggerHandler 实现
* @date: 2021/8/15 14:40
*/
public class MyLoggerHandler implements InvocationHandler {
/** 原始对象 **/
private Object objOriginal;
/** 这里很关键 **/
private MyLogger myLogger = new MyLoggerImpl(); //接口 = 类
public MyLoggerHandler(Object obj){
super();
this.objOriginal = obj;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object result = null;
/** 日志类的方法 **/
myLogger.saveIntoMethodTime(method);
/** 调用代理类方法 **/
result = method.invoke(this.objOriginal ,args);
/** 日志类方法**/
myLogger.saveOutMethodTime(method);
return result;
}
}
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) {
/** 实例化真实项目中业务类 **/
BusinessClassService businessClassService = new BusinessClassServiceImpl();
/** 日志类的handler **/
MyLoggerHandler myLoggerHandler = new MyLoggerHandler(businessClassService);
/** 获得代理类对象 **/
BusinessClassService businessClass = (BusinessClassService) Proxy.newProxyInstance(businessClassService.getClass().getClassLoader(), businessClassService.getClass().getInterfaces(),myLoggerHandler);
/** 执行代理类方法 **/
businessClass.doSomeThing();
}
}
结果输出: