Spring的AOP是建立在Java的动态代理的基础上的,学习Java动态代理机制有助于循序渐进地理解AOP的思想。

传统的日志输出方法是在每一个业务逻辑方法里编写记录日志的代码,这样,程序中就会有很多类似的日志输出代码,造成了很大的耦合。那么,使用什么方法可以使业务逻辑和输出日志的代码分离,并实现日志信息代码的重用呢?Java的代理机制可以改善这个问题。

首先编写一个日志信息的代理类,这个类实现了接口InvocationHandler,然后编写一个接口,并实现这个接口,在实现类中编写具体的逻辑代码,最后针对接口编写测试类,查看测试结果。具体步骤如下:

(1)编写一个日志信息的代理类LogProxy,这个类实现了接口InvocationHandler,可以对任何接口实现日志的输出。LogProxy.java代码如下

View Code

/**
* */package com.jp.action;

import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;

import org.apache.log4j.Level;import org.apache.log4j.Logger;

/**
* @author JP
* */// 代理类实现了接口InvocationHandlerpublic class LogProxy implements InvocationHandler {

/*
* (non-Javadoc)
*
* @see java.lang.reflect.InvocationHandler#invoke(java.lang.Object,
* java.lang.reflect.Method, java.lang.Object[])*/private Logger logger = Logger.getLogger(this.getClass().getName());private Object delegate;

// 绑定代理对象 public Object bind(Object delegate) {this.delegate = delegate;return Proxy.newProxyInstance(delegate.getClass().getClassLoader(),
delegate.getClass().getInterfaces(), this);
}

// 针对接口编程 @Overridepublic Object invoke(Object proxy, Method method, Object[] args)throws Throwable {// TODO Auto-generated method stub Object result = null;try {
logger.log(Level.INFO, args[0] + " 开始审核数据...");
result = method.invoke(delegate, args);
logger.log(Level.INFO, args[0] + " 审核数据结束");
} catch (Exception e) {// TODO Auto-generated catch block logger.log(Level.INFO, e.toString());
}

return result;
}

}

(2)定义一个接口:TimeBookInterface.java

View Code

package com.jp.impl;

/**
* @author JP
**/public interface TimeBookInterface {public void doAuditing(String name);

}

(3)TimeBook类实现上述接口,doAuditing()方法是具体的业务逻辑处理

View Code

package com.jp.action;

import org.apache.log4j.Logger;

import com.jp.impl.TimeBookInterface;

/**
* @author JP
**/public class TimeBook implements TimeBookInterface{private Logger logger=Logger.getLogger(this.getClass().getName());

@Overridepublic void doAuditing(String name){
System.out.println(name+" is doing something about auditing...");
}

}

(4)编写测试程序TestHelloWorld.java 使用日志代理类LogProxy实现日志的输出。TestHelloWorld.java代码如下

View Code

package com.jp.test;import com.jp.action.LogProxy;import com.jp.action.TimeBook;import com.jp.impl.TimeBookInterface;

public class TestHelloWorld {

public static void main(String[] args){// TODO Auto-generated method stub LogProxy logProxy=new LogProxy();
TimeBookInterface timeBookProxy=(TimeBookInterface) logProxy.bind(new TimeBook());
timeBookProxy.doAuditing("张三");
}
}

(5)运行测试程序,即可得到通过LogProxy类输出的日志信息

这种方式,对于其他的类也同样适用,这样就真正实现了业务逻辑和输出日志信息代码的分离

使用Java的代理机制进行日志输出相关推荐

  1. Java 动态代理机制分析及扩展--转

    http://www.ibm.com/developerworks/cn/java/j-lo-proxy1/#icomments http://www.ibm.com/developerworks/c ...

  2. Java 动态代理机制详解

    在学习Spring的时候,我们知道Spring主要有两大思想,一个是IoC,另一个就是AOP,对于IoC,依赖注入就不用多说了,而对于Spring的核心AOP来说,我们不但要知道怎么通过AOP来满足的 ...

  3. Java 动态代理机制分析及扩展,第 1 部分

    引言 Java 动态代理机制的出现,使得 Java 开发人员不用手工编写代理类,只要简单地指定一组接口及委托类对象,便能动态地获得代理类.代理类会负责将所有的方法调用分派到委托对象上反射执行,在分派执 ...

  4. Java 动态代理机制分析及扩展

    简介: 本文通过分析 Java 动态代理的机制和特点,解读动态代理类的源代码,并且模拟推演了动态代理类的可能实现,向读者阐述了一个完整的 Java 动态代理运作过程,希望能帮助读者加深对 Java 动 ...

  5. Java库:Jansi - 彩色日志输出体验

    Java库:Jansi - 彩色日志输出体验 环境:JDK8.springboot 依赖库:Jansi Jansi简介:Jansi是一个小型 Java 库,它允许您使用ANSI 转义码来格式化您的控制 ...

  6. java Proxy(代理机制)

    我们知道Spring主要有两大思想,一个是IoC,另一个就是AOP,对于IoC,依赖注入就不用多说了,而对于Spring的核心AOP来说,我们不但要知道怎么通过AOP来满足的我们的功能,我们更需要学习 ...

  7. 详解Java动态代理机制

    之前介绍的反射和注解都是Java中的动态特性,还有即将介绍的动态代理也是Java中的一个动态特性.这些动态特性使得我们的程序很灵活.动态代理是面向AOP编程的基础.通过动态代理,我们可以在运行时动态创 ...

  8. Java动态代理机制

    在Java的动态代理机制中,有两个重要的类.一个是InvocationHandler,另一个是Proxy. InvocationHandler:每一个动态代理类都必须要实现InvocationHand ...

  9. Java动态代理机制详解(JDK 和CGLIB,Javassist,ASM)

    class文件简介及加载 Java编译器编译好Java文件之后,产生.class 文件在磁盘中.这种class文件是二进制文件,内容是只有JVM虚拟机能够识别的机器码.JVM虚拟机读取字节码文件,取出 ...

最新文章

  1. 从注册流程 分析如何安全退出多个Activity 多种方式(附DEMO)
  2. 三因素三水平正交表l9_影响多腔导管挤出机头设计的关键因素
  3. Python datetime timedelta
  4. 就在这段时间让自己充实起来
  5. 手机网页宽度自动适应屏幕宽度的方…
  6. 快速从小白到大牛的Python学习路线
  7. 攻防世界 web2 write up
  8. Separating Skills and Concepts for Novel Visual Question Answering 论文笔记
  9. skype 无法连接
  10. 001 Joiner
  11. Day10【LeetCode每日一题】781. 森林中的兔子
  12. 用Python求三角形面积
  13. wifi-pumpkin/wifipumpkin3-2022-kali安装(源码编译)
  14. 怎样进行电路的抗干扰设计
  15. 【RHEL】RHEL 7.6 用户和组管理
  16. 万能电视遥控器代码表
  17. RadioKingTX18s遥控器(EdgeTx系统)搭配FlySky-ia6b接收机(富斯)在MissionPlanner配置pixhawk2.4.8失控保护功能
  18. Leslie Valiant获得2010年图灵奖
  19. 区块链动态化监管方案
  20. linux7.3如何解压软件,Linux中的压缩软件7-zip的使用教程

热门文章

  1. mysql怎么添加约束成绩_mysql怎么添加约束?
  2. koa 接口返回数据_koa+node基础搭建到实现api接口
  3. 了解PostCSS原理
  4. php vue seo,处理 Vue 单页面 SEO 的另一种思路
  5. CSS选择器的种类使用
  6. 20191022:(leetcode习题)山脉数组的峰顶索引
  7. android sqlite联合,在联合查询中,Android SQLiteorder by 计算列_sql_开发99编程知识库...
  8. Java怎么实现大的map_关于Java中的ConcurrentHashMap的实现原理有大神可以详细介绍下吗?...
  9. 做VB的,经常注册和反注册OCX控件和DLL链
  10. VB:读取及设定NumLock/CapsLock/ScrollLock的值