AOP日志框架实现

JDK动态代理实现日志框架

首先,在项目包com.ay.test 下创建业务接口类BusinessClassService,具体代码如下:

BusinessC lassService 业务接口类可以理解为日常开发业务创建的接口类, 接口中有一个简 单的方法doSomeThing 。然后,开发业务类的实现类BusinessClassServiceImpl,具体代码如下:

实现类BusinessClassServicelmpl 实现了BusinessClassServ ice 接口, 并实现了doSomeThing 方法,在方法中打印“ do something ......” 。接着,开发日志接口类My Logger , 具体代码如下:

• savelntoMethodTime : 记录进入方法的时间。 • saveOutMethodTime : 记录退出方法的时间。 接口类MyLogger 开发完成之后,用MyLoggerlmpl 类实现它, 具体代码如下:

MyLoggerlmpl 类实现接口MyLogger , 并实现savelntoMethodTime 和saveOutMethodTime 方法,在方法内部打印进入/退出方法的时间。 最后, 实现最重要的类MyLoggerHandler , 具体代码如下:

• lnvocationHandler : 该接口中仅定义了一个方法: public Object invoke(Object obj, Method method, Object[] args) , 在使用时,第一个参数obj 一般是指代理类, method是 被代理的方法, args为该方法的参数数组。这个抽象方法在代理类中动态实现。 所有的代码开发完成之后,开发测试类MyLoggerTest 进行测试, 具体代码如下:

• Proxy . newProxylnstance :该类即为动态代理类, static Object newProxylnstance (ClassLoader loader, Class[] interfaces, JnvocationHandler h),返回代理类的一个实例,返 回后的代理类可以当作被代理类使用。在Proxy.new Proxy Instance方法中,共有以下三 个参数: • Classloader loader: targetObject.getClass().getClassLoader()目标对象通过getClass 方法获取类的所有信息后,调用getClassLoader()方法来获取类加载器。获取类力口载 器后,可以通过这个类型的加载器,在程序运行时,将生成的代理类力口载到JVM即 Java虚拟机中,以使运行时需要。 •Class[] interfaces: targetObject.getClass().getinterfaces()获取被代理类的所有接口信 息,以便于生成的代理类可以具有代理类接口中的所有方法。 • lnvocationHandler h : 使用动态代理是为了更好地扩展, 比如在方法之前做什么操 作,之后做什么操作,这个时候这些公共的操作可以统一交给代理类去做。此时需 要调用实现了InvocationHandler 类的一个回调方法。

运行测试类的ma in 方法,便可以在Intellij IDEA 控制台查看打印信息,具体信息如下:

以上就是利用动态代理模式实现简单的日志框架, 具体的结构如图

这里总结一下JDK 动态代理的一般实现步骤: ( l )创建一个实现InvocationHandler 接口的类MyLoggerHandler,它必须实现invoke 方法。 (2 )创建被代理的类BusinessClassService 以及接口BusinessClassServicelmpl 。 (3 )调用Proxy 的静态方法newProxyInstance ,创建一个代理类。 ( 4 )通过代理类调用方法。

spring aop实现日志框架

使用Spring AOP 的注解方式实现日志框架是非常简单的。首先,在配置文件 spring-mvc且nl 中添加配置, 具体代码如下:

 <aop:aspectj-autoproxy proxy-target-class="true">
  • </aop:aspectj-autoproxy>: 声明自动为Spring容器中那些配置@aspectJ切面的bean创建 代理,织入切面。<aop : aspectj -autoproxy />有一个proxy-target-class属性,默认为fal se, 表示使用JDK动态代理织入增强,当配置poxy-target-class 为true 时,表示使用CGLib动 态代理技术织入增强。不过即使设置proxy-target-class 为fa lse ,如果目标类没有声明接 口,则Spring将自动使用CGLib动态代理。

配置添加完成之后,要定义一个切面Loglnterceptor ,具体代码如下:

• @Aspect : 标识Loglntercepto r类为一个切面,供容器读取. • @Before : 在所拦截方法执行之前执行before 方法。 • @After:在所拦截方法执行之后执行after方法。 • @Around :可以同时在所拦截方法的前后执行一段逻辑。 • execution 切入点指示符: 表示在controller 包中定义的任意方法 的执行。execution 切入点指示符执行表达式的格式如下:

翻译为:

其中黑色字体部分不能省略,各部分都支持通配符“*”来匹配全部。比较特殊的为形参 表部分,其支持以下两种通配符:

例如:

下面举一些execution 的使用实例,具体内容见表3 -3 。

切面类Loglnterceptor 开发完成之后, 重新启动springmvc-mybatis-book 项目,项目成功启 动后,在浏览器输入网址: http: //localbost: 8080/user/findAll , 便可以在lntellij IDEA 开发工具的 控制台看到如下的打印信息:

AOP日志框架实现的更多相关文章

  1. SSM整合AOP,日志框架和拦截器

    前言 日志是所有系统必不可少的部分,而AOP在MVC通常用于监控方法调用,可以生成一个traceid,记录从用户调用到底层数据库的数据链路,帮助监控和排查问题. AOP 现在做一个简单的前置切面,用来 ...

  2. 关于Jersey框架下的Aop日志 和Spring 框架下的Aop日志

    摘要 最近新接手的项目经常要查问题,但是,前面一拨人,日志打的非常乱,好多就根本没有打日志,所以弄一个AOP统一打印一下 请求数据和响应数据 框架 spring+springmvc+jersey 正文 ...

  3. AOP日志组件 多次获取post参数

    AOP日志组件 多次获取post参数 需求:新增接口日志组件.通过拦截器对接口URL进行拦截处理,然后将接口post请求的参数与结果,写入日志表. 问题:POST方法的参数是存储在request.ge ...

  4. java日志框架笔记-log4j-springboot整合

    # 日志框架slf4j log4j logback之间的关系 简答的讲就是slf4j是一系列的日志接口,而log4j logback是具体实现了的日志框架. ```java SLF4J获得logger ...

  5. 08 SSM整合案例(企业权限管理系统):11.AOP日志

    04.AdminLTE的基本介绍 05.SSM整合案例的基本介绍 06.产品操作 07.订单操作 08.权限控制 09.用户和角色操作 10.权限关联 11.AOP日志 11.AOP日志 1.数据库与 ...

  6. 带你掌握Java各种日志框架

    一:日志基本概念及框架 1:什么是日志 Java程序员在开发项目时都是依赖Eclipse/IDEA等集成开发工具的Debug调试功能来跟踪解决Bug,但项目打包部署发布到了测试环境和生产环境怎么办?难 ...

  7. 解读ASP.NET 5 & MVC6系列(9):日志框架

    框架介绍 在之前的.NET中,微软还没有提供过像样的日志框架,目前能用的一些框架比如Log4Net.NLog.CommonLogging使用起来多多少少都有些费劲,和java的SLF4J根本无法相比. ...

  8. Java日志框架:SLF4J,Common-Logging,Log4J,Logback说明

    Log4j  Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台.文件.GUI组件.甚至是套接口服务 器.NT的事件记录器.UNIX Syslog守护进程等 ...

  9. java日志框架slf4j与log4j

    日志记录自然是非常重要的,但恐怕能记住slf4j与log4j等日志框架配置的人就很少了,这个东西不难,只是配置好后很少会去动它,开发新项目一般也是从其他项目拷贝,或者参照文档 废话不多说,先说log4 ...

随机推荐

  1. 在jinja2的页面中使用javascript对页面元素进行删除

    以对用户注册信息的审核为例. 后端的代码为: #encoding=utf-8 class RegisterCheck(system.page): '''注册信息审核''' path = "/ ...

  2. PCRE函数简介和使用示例

    PCRE是一个NFA正则引擎,不然不能提供完全与Perl一致的正则语法功能.但它同时也实现了DFA,只是满足数学意义上的正则. PCRE提供了19个接口函数,为了简单介绍,使用PCRE内带的测试程序( ...

  3. easyUI排序问题

    使用easyUI时,需要在点击页面的某一列进行desc或asc排序,那么在jsp中可以把该列js的sortable 设置true. 加在某字段上时,该字段点击时页面会出现一小三角图案 ,此时easyU ...

  4. java 定时备份数据库

    原文:http://www.open-open.com/code/view/1447490829678 /** 操作数据库 */ public class BackupDb { public Stri ...

  5. Linux下获取线程TID的方法

    如何获取进程的PID(process ID)? 可以使用: #include <unistd.h> pid_t getpid(void); 通过查看头文件说明,可以得到更详细的信息: fi ...

  6. Robotframework集成jenkins执行用例

    Robotframework+jenkins配置 假设我们完成了一个模块的用例设计,可是想晚上9点或凌晨运行,这时候该怎么实现呢?jenkins可以很好解决我们的疑难. Jenkins安装 这里简单说 ...

  7. 利用wxpython编写GUI

    首先建立一个简单的布局合理的图形界面,但是其中按下按键没有事情发生 #encoding=utf-8 __author__ = 'heng' #编写一个GUI import wx app = wx.Ap ...

  8. oracle 重要函数

    1)instr()函数的格式 (俗称:字符查找函数) 格式一:instr( string1, string2 ) / instr(源字符串, 目标字符串) 格式二:instr( string1, st ...

  9. 导入别人的Android项目,提示 /Libs/gen already exists but is not a source folder. Convert to a source folder or rename it

    解决方法: 遇到这个问题的解决方法: 1. 右键点击工程,选择 "Properties" 2. 选择左边的 "Java Build Path" 3. 打开 &q ...

  10. 在myeclipse下面创建多层包

    比如animal.cat.dog包 先创建animal包 然后创建animal.cat包 最后创建animal.cat.dog包 最后你发现这三个文件夹是分层的,层层嵌套的三个文件夹,而不是一个文件夹 ...