Spring动态代理实现日志功能

代理模式(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();

    }

}

结果输出:

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值