• 使用Java的代理机制进行日志输出


    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
    *
    */
    // 代理类实现了接口InvocationHandler
    public 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);
    }

    // 针对接口编程
    @Override
    public 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());

    @Override
    public 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类输出的日志信息

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

  • 相关阅读:
    大数相加(类似杭电oj平台上acm1002)
    DAY2-JAVA
    DAY1--JAVA
    网络编程之解决粘包问题的简单模型
    mybatis resultType resultMap 区别
    Spring学习1:Spring基本特性
    mybatis中useGeneratedKeys和keyProperty的作用
    mybatis 三剑客 generator配置 、mybatis plugin
    常用 Git 命令清单
    mysql btree与hash索引的适用场景和限制
  • 原文地址:https://www.cnblogs.com/chenying99/p/2698662.html
Copyright © 2020-2023  润新知