Spring动态代理实现日志功能详解

 更新时间:2021年08月17日 11:02:52   作者:haijiao12138  
这篇文章主要为大家详细介绍了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.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());
    }
}

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();
 
    }
 
}

结果输出:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Java使用Fastjson进行JSON数据操作教程详解

    Java使用Fastjson进行JSON数据操作教程详解

    Fastjson 是一个 Java 库,可以用来将 Java 对象转换为它们的 JSON 表示,本文主要为大家详细介绍了Java如何使用Fastjson进行JSON数据操作,需要的可以参考下
    2023-12-12
  • Java搭建简单Netty开发环境入门教程

    Java搭建简单Netty开发环境入门教程

    这篇文章主要介绍了Java搭建简单Netty开发环境入门教程,有详细的代码展示和maven依赖,能够帮助你快速上手Netty开发框架,需要的朋友可以参考下
    2021-06-06
  • 探讨如何在Eclipse中过滤版本控制文件.svn

    探讨如何在Eclipse中过滤版本控制文件.svn

    本篇文章是对在Eclipse中过滤版本控制文件.svn的方法进行了详细的分析介绍,需要的朋友参考下
    2013-07-07
  • Java程序去调用并执行shell脚本及问题总结(推荐)

    Java程序去调用并执行shell脚本及问题总结(推荐)

    这篇文章主要介绍了Java程序去调用并执行shell脚本及问题总结,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-06-06
  • Mybatis-Plus使用updateById()、update()将字段更新为null

    Mybatis-Plus使用updateById()、update()将字段更新为null

    本文主要介绍了Mybatis-Plus使用updateById()、update()将字段更新为null,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • SpringBoot+MyBatis+AOP实现读写分离的示例代码

    SpringBoot+MyBatis+AOP实现读写分离的示例代码

    高并发这个阶段,肯定是需要做MySQL读写分离的。本文主要介绍了SpringBoot+MyBatis+AOP实现读写分离的示例代码,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • Spring AOP实现多数据源动态切换

    Spring AOP实现多数据源动态切换

    本文主要介绍了Spring AOP实现多数据源动态切换,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • Mybatis批处理、Mysql深分页操作

    Mybatis批处理、Mysql深分页操作

    这篇文章主要介绍了Mybatis批处理、Mysql深分页操作,Mybatis批量操作包括Foreach方式和ExecutorType.BATCH插入操作,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-08-08
  • Spring 框架中的 Bean 作用域(Scope)使用详解

    Spring 框架中的 Bean 作用域(Scope)使用详解

    Spring框架中的Bean作用域(Scope)决定了在应用程序中创建和管理的Bean对象的生命周期和可见性。本文将详细介绍Spring框架中的Bean作用域的不同类型,包括Singleton、Prototype、Request、Session和Application,并解释它们的特点和适用场景。
    2023-09-09
  • JAVA Optional类用法分享

    JAVA Optional类用法分享

    本篇文章主要给大家分析了JAVA中Optional类用法以及代码分析,跟着小编学习下吧。
    2017-12-12

最新评论