从一个输出日志的实例分析JAVA的代理机制

一、通用的日志输出方法  :需要在每个类里都增加对输出日志信息的代码

二、通过面向接口编程实现日志的输出(JAVA的静态代理):虽然实现了业务逻辑与输出日志信息的分离,但必须依赖固定的接口;

三、使用JAVA的代理机制进行日志输出(JAVA的动态代理):真正实现了对输入日志信息代码的重用,并且不依赖于固定的接口实现

通用的日志输出方法:

在每一个业务逻辑方法里编写记录日志的代码

 //*****TimeBook.java*******
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
public class TimeBook{
private Logger logger = Logger.getLogger(this.getClass().getName());
//审核数据的相关程序
public void doAuditing(String name){
logger.log(Level.INFO,name+" 开始审核数据...");
//审核数据的相关程序
...
logger.log(Level.INFO,name+" 审核数据结束..."); }
}

如上示例代码,日志信息添加到具体的业务逻辑中,如果程序中其他代码需要日志输出的功能,那么每个程序都要添加和上面类似的代码。

这样在程序中,就会存在很多类似的日志输出代码,造成很大的耦合。我们通过面向接口编程改进这个问题。

通过面向接口编程实现日志的输出:

1.首先把doAuditing()方法提取出来成为接口,然后通过一个实体类实现这个方法,在这个方法里编写具体的业务逻辑代码

接口和实现接口类

2.通过一个代理类来进行日志输出

 //******TimeBookProxy.java*****
package com.gc.action;
import org.apache.log4j.Level;
import org.apache.log4j.Logger; import com.gc.impl.TimeBookInterface; public class TimeBookProxy{
private Logger logger = Logger.getLogger(this.getClass().getName);
private TimeBookInterface timeBookInterface;
//在该类中针对前面的接口编程,而不针对具体的类
public TimeBookProxy(TimeBookInterface timeBookInterface)
{
this.timeBookInterface = timeBookInterface;
}
//实际业务处理
public void doAuditing(String name){
logger.log(Level.INFO,name+" 开始审核数据...");
timeBookInterface.doAuditing(name);
logger.log(Level.INFO,name+" 审核数据结束...");
}
}

3.编写测试程序

 //****TestHelloWorld.java******
package com.gc.test;
import com.gc.action.TimeBook;
import com.gc.action.TimeBookProxy;
public class TestHelloWorld{
public static void main(String[] args){
TimeBookProxy timeBookProxy = new TimeBookProxy(new TimeBook());
timeBookProxy.doAuditing("victory");
}
}

和前面一个日志做对比,可以看到在这个示例中,具体的业务逻辑代码和日志信息代码分离开了,只要实现了接口TimeBookInterface的类,都可以通过

代理类TimeBookProxy实现日志信息的输出,而不用再每个类里面都写日志信息输出的代码,从而实现了日志信息的代码重用。

使用JAVA的代理机制进行日志输出:

上面代码仍然有一些局限性,因为要使用代理类,就必须要实现固定的接口,有没有一种通用的机制,不管是不是实现这个接口,都可以实现日志信息的输出?

JAVA提供的InvocationHandler接口可以实现这种功能

1.编写一个日志信息的代理类,这个代理类实现接口InvocationHandler

 //****LogProxy.java****
package com.gc.action; import java.lang.reflect.InovationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy; import org.apache.log4j.Level;
import org.apache.log4j.Logger;
//代理类实现了接口InvocationHandler
public class LogProxy implement InvocationHandler{
private Logger logger = Logger.getLogger(this.getClass().getName());
private Object obj;
//绑定代理对象
public Object bind(Object obj){
this.obj = obj;
return Proxy.newProxyInstance(obj.getClass().getClassLoader(),obj.getClass().getInstances(),this);
}
//针对接口编程
public Object invoke(Object proxy,Method method,Object[] args) throw Throwable{
Object result = null;
try{
//在方法调用前后进行日志输出
logger.log(Level.INFO,args[0]+"开始审核数据...");
result = method.invoke(obj,args);
logger.log(Level.INFO,args[0]+"审核数据结束..."); }
catch(Exception e){
logger.log(Level.INFO,e,toString());
}
return result;
}
}

2.编写一个接口,并实现这个接口,在实现类中编写具体的考勤审核代码

参看以上代码  接口和实现接口类

3.编写测试类,查看测试结果

 //*******TestHelloWorld.java*****

 package com.gc.test;
import com.gc.action.TimeBook;
import com.gc.action.TimeBookProxy;
import com.gc.impl.TimeBookInterface;
import com.gc.action.LogProxy;
public class TestHelloWorld{
public static void mian(String[] args)
{
//实现了对日志类的重用
LogProxy logProxy = new LogProxy();
TimeBookInterface timeBookProxy = (TimeBookInterface)logProxy.bind(new TimeBook());
timeBookProxy.doAuditing("victory");
}
}

学习AOP之JAVA的代理机制的更多相关文章

  1. Java 动态代理机制详解

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

  2. 转:AOP与JAVA动态代理

    原文链接:AOP与JAVA动态代理 1.AOP的各种实现 AOP就是面向切面编程,我们可以从以下几个层面来实现AOP 在编译期修改源代码 在运行期字节码加载前修改字节码 在运行期字节码加载后动态创建代 ...

  3. java动态代理机制

    首先了解代理设计模式,其思想是为其他对象提供一种代理以控制对这个对象的访问. java动态代理就是遵循这种思想,spring中的AOP实现原理就是java的动态代理. 在java的动态代理机制中,有两 ...

  4. 详解java动态代理机制以及使用场景

    详解java动态代理机制以及使用场景 https://blog.csdn.net/u011784767/article/details/78281384 深入理解java动态代理的实现机制 https ...

  5. 大厂高级工程师面试必问系列:Java动态代理机制和实现原理详解

    代理模式 Java动态代理运用了设计模式中常用的代理模式 代理模式: 目的就是为其他对象提供一个代理用来控制对某个真实对象的访问 代理类的作用: 为委托类预处理消息 过滤消息并转发消息 进行消息被委托 ...

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

    Java 动态代理机制分析及扩展,第 1 部分 王 忠平, 软件工程师, IBM 何 平, 软件工程师, IBM 简介: 本文通过分析 Java 动态代理的机制和特点,解读动态代理类的源代码,并且模拟 ...

  7. [转]Java 动态代理机制分析及扩展

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

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

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

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

    Java 动态代理机制分析及扩展,第 1 部分 http://www.ibm.com/developerworks/cn/java/j-lo-proxy1/ 本文通过分析 Java 动态代理的机制和特 ...

随机推荐

  1. visio二次开发——图纸解析之线段

    多写博客,其实还是蛮好的习惯的,当初大学的时候导师就叫我写,但是就是懒,大学的时候,谁不是魔兽或者LOL呢,是吧,哈哈哈. 好了,接着上一篇visio二次开发——图纸解析,我继续写. 摘要: (转发请 ...

  2. 如何解决mathpage.dll或MathType.dll文件找不到问题

    解决方法(具体图文教程): 步骤一 要确保路径被office信任.依次打开word->文件->选项->信任中心->信任中心设置->添加新位置,添加C:\Program F ...

  3. 【bzoj4720】[NOIP2016]换教室

    题目描述 对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的课程.在可以选择的课程中,有2n节课程安排在n个时间段上.在第i(1≤i≤n)个时间段上,两节内容相同的课程同时在不同的 ...

  4. PHP数组合并+与array_merge的区别分析 & 对多个数组合并去重技巧

    PHP中两个数组合并可以使用+或者array_merge,但之间还是有区别的,而且这些区别如果了解不清楚项目中会要命的! 主要区别是两个或者多个数组中如果出现相同键名,键名分为字符串或者数字,需要注意 ...

  5. Daily Scrum Meeting ——ThirdDay

    一.Daily Scrum Meeting照片 二.Burndown Chart 三.项目进展 1.完成了github上的文档整理 Transcend/ActivityHelper 2.主界面侧滑框的 ...

  6. FZU 2112 并查集、欧拉通路

    原题:http://acm.fzu.edu.cn/problem.php?pid=2112 首先是,票上没有提到的点是不需要去的. 然后我们先考虑这个图有几个连通分量,我们可以用一个并查集来维护,假设 ...

  7. HDU 5686 斐波那契数列、Java求大数

    原题:http://acm.hdu.edu.cn/showproblem.php?pid=5686 当我们要求f[n]时,可以考虑为前n-1个1的情况有加了一个1. 此时有两种情况:当不适用第n个1进 ...

  8. UI设计

    微软压平的瓷砖设计符合最直接的信息接受方式,但不符合人类的审美观念. 换句话说,除了平,还有艺术,人类的脑力活动从不会平的像个白板,它是九曲十八弯的脉冲波动. 人类几千年的的审美史上,从没有出现过这种 ...

  9. r-cnn学习(八):minibatch

    这段代码包括由输入图片随机生成相应的RoIs,并生成相应的blobs,由roidb得到相应的 minibatch.其代码如下. # ---------------------------------- ...

  10. Linux IO模式及 select、poll、epoll详解

    linux的IO调度文章==> https://segmentfault.com/a/1190000003063859?hmsr=toutiao.io&utm_medium=toutia ...