`

Java中动态代理的实现

阅读更多

    通过上一篇《java中代理模式的实现步骤》,我们已经掌握了如何运用代理模式进行权限[quan xian]设计等相关需求的编程方式,在有些情况下,我们会有特殊的需求,比如说我们需要实现一个数据库的连接池,连接池给调用者提供连接(Connection)的对象,使用者在用过Connection对象之后需要归还连接,而Connection中有一个方法叫close(),此时我们希望用户在使用完对象后直接调用close()方法进行连接的归还,这样有两个好处,第一,用户不必关心使用哪个方法归还连接,甚至用户不需要知道归还连接这回事;第二,不必再多写一个方法,给调用带来麻烦,用户的感觉好像就是使用完连接之后直接close掉,这样对用户很透明。那么如何实现这个功能呢?
    我们可以使用上一篇文章中讲述的代理模式来完成这个任务,我们可以编写一个代理类实现Connection接口,然后在连接池送出连接对象的时候,我们实际送出的是代理类的对a象,当代理类对象的方法被调用的时候,代理类对象通过对真实的Connection的对象的相应功能进行调用来完成具体功能,但是如果被调用的方法是close的话,代理类中的方法不是去真的调用Connection中的close方法,而是完成连接归还这个动作,这样就当到我们预定的需求了,但是当你真的开始使用这个方法开始编写程序的时候,你会发现为了完成这个任务,你需要实现Connection中的很多个方法,而这样做的目的只是为了一个close方法的功能重写,这对程序编写来讲带来了很多的麻烦,为此,我们提出了动态过程中动态产生一个代理类的对象,这个代理类对象负责监视被调用的方法,如果是close方法,则处理连接归还的任务,否则就将调用传递给Connection对象的相关方法去处理。接下来我们通过实例来表达具体的实现步骤。
    首先我们给出连接池实现类的部分示范代码:
public class ConnectionPool {
    /*
    ......此处省略很多代码
    */

    public Connection getConnection() {
        Connection con;
        /*
        ......此处省略部分代码;
        ......取得真实的Connection的对象记录在con中
        */

        return con;
    }
}
    在上面的代码示例中,我们可以看到getConnection方法通过取得连接对象并返回给调用者,这里我们需要修改如上代码,我们不能把Connection的对象直接返回给调用这个,我们需要送出去的是一个代理类的对象。而java中为我们提供了动态创建代理类对象的工具java.lang.reflect.Proxy类,可以使用这个类中的静态方法[jing tai fang fa]newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)来创建动态代理对象,这个方法需要几个参数,第一个参数是类加载器,这个参数没有什么问题[wen ti],第二个参数就是要求动态代理类对象实现的所有的接口,第三个参数是用于[yong yu]处理回调的对象,当动态代理类对象中的方法被调用的时候,回调处理类的对象会收到处理通知,我们可以判断被调用的是什么方法来做出相关的处理,这个回调处理类需要实现InvocationHandler接口,接下来看一下这个接口中的方法:
 Object invoke(Object proxy, Method method, Object[] args)
    从方法的参数,我们可以轻松地看出,第一个参数是被调用的代理类对象的引用,第二个参数是被调用的方法的实例描述,可以通过这个参数判断出被调用的是哪个方法,第三个参数是调用时出入的方法的参数,有了这样的工具,我们可以修改上面的ConnectionPool类的内容了。
public class ConnectionPool {
    /*
    ......此处省略很多代码
    */

    /*
    * 我们通过一个内部类[nei bu lei]来实现InvocationHandler
    */
    private class ConnectionHandler implements InvocationHandler {
        //这个属性[shu xing]用户记录真实的Connection对象
        private Connection con;
        public ConnectionHandler(Connection con) {
            this.con = con;
        }

        public Object invoke(Object proxy, Method method, Object[] args) {
            if(Method.getName().equals("close") {
                //处理归还连接的任务
            }
            else {
                method.invoke(con, args);
            }
        }
    }

    public Connection getConnection() {
        Connection con;
        /*
        ......此处省略部分代码;
        ......取得真实的Connection的对象记录在con中
        */

        Connection tc = Proxy.newProxyInstance(Connection.class.getClassLoader(), new Class[]{Connection.class}, new ConnectionHandler(con));

        return tc;
    }
}

    好了,到这里,我们已经成功地把连接池中的代理模式的使用替换成了动态代理的实现。在你需要地方大胆去使用吧,祝你成功

分享到:
评论

相关推荐

    Java实现动态代理

    - 在MyBatis中,SqlSession就是通过动态代理实现的。当调用SqlSession的CRUD方法时,实际上执行的是Mapper接口的方法,而这个过程是由动态代理完成的,它处理了SQL的执行、结果映射等逻辑。 - 类似地,连接池工具...

    Java动态代理两种实现方式

    Java提供了两种主要的动态代理实现方式:JDK自身的动态代理(基于接口)和Cglib库。 ### JDK动态代理 JDK动态代理是通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来实现的。Proxy类...

    用Java动态代理实现AOP

    在本文中,我们将通过一个简单的例子来展示如何使用Java动态代理实现AOP。首先,我们定义了一个business接口和一个实现类BusinessObject,BusinessObject中包含了商业逻辑代码和日志记录代码。 ```java public ...

    JAVA实现动态代理的简单流程

    在深入探讨Java动态代理的实现过程之前,我们首先需要理解动态代理的基本概念及其在Java中的应用价值。动态代理,顾名思义,是在运行时动态创建代理对象的一种机制,它无需在编译期就确定代理类的具体实现,而是通过...

    使用JAVA中的动态代理实现数据库连接池

    以下是一个简单的示例,展示如何使用动态代理实现数据库连接池: 1. 定义数据库连接池参数类(如`DBPoolConfig`),存储JDBC驱动类名、URL、用户名和密码等信息,用于初始化连接池。 ```java public class ...

    java 动态代理实现AOP

    ### Java动态代理实现AOP详解 #### 一、引言 随着软件开发复杂度的提升,传统的面向对象编程(OOP)已经难以满足现代软件工程的需求。为了更好地管理跨切面的关注点,如日志记录、性能监控、安全控制等,面向切面...

    java动态代理实现详解

    Java 动态代理是Java平台提供的一种强大的工具,它允许我们在运行时动态生成代理类,这些代理类可以实现一组指定的接口,同时还能在方法调用前后添加自定义的行为。这种机制大大简化了面向切面编程(AOP)和事件监听...

    java分页 动态代理 aop实现

    本话题主要围绕"Java分页"、"动态代理"以及"AOP(面向切面编程)"在Spring框架中的实现进行详细讲解。 首先,我们来看"Java分页"。在处理大量数据时,一次性加载所有数据不仅会消耗大量的内存,也可能导致用户界面...

    java-jdk动态代理的实现demo

    在Java中,JDK提供了一个`java.lang.reflect.Proxy`类和一个`java.lang.reflect.InvocationHandler`接口,它们是实现动态代理的关键。Proxy类用于创建代理对象,而InvocationHandler接口定义了处理方法调用的逻辑。 ...

    Java中动态代理的介绍及实例

    ### Java中动态代理的核心知识点详解 #### 一、动态代理概览 动态代理是Java反射机制的一个重要应用,主要用于在不修改目标对象源代码的情况下,为一个对象提供一个代理对象,这个代理对象能够控制对目标对象的...

    java动态代理demo

    Java动态代理是Java编程中一个重要的特性,它允许我们在运行时创建代理对象,这些代理对象可以代表并增强原对象的功能。动态代理在很多场景下都非常有用,比如日志记录、性能监控、事务管理等。本示例将带你深入理解...

    Java动态代理实现数据源连接池

    总的来说,Java动态代理实现数据源连接池的核心思想是利用`InvocationHandler`来拦截对数据库操作的调用,通过代理对象在每次操作前后进行连接的获取和释放,从而实现连接池的逻辑。这种方式虽然相比现成的连接池库...

    java动态代理实例

    在这个实例中,我们将深入探讨Java动态代理的核心概念,以及如何利用它来实现拦截器模式。 首先,我们需要了解Java动态代理的基本原理。在Java中,动态代理主要通过`java.lang.reflect.Proxy`类和`java.lang....

    java Proxy 动态代理

    - 插件系统:插件可以通过动态代理实现与主程序的交互,而无需了解主程序的具体实现。 5. **源码分析**: 虽然没有具体的源码提供,但`Proxy.newProxyInstance()`方法的实现涉及到JVM层面的字节码生成。它会生成...

    用Java实现的代理模式之动态代理

    在Java中,代理模式有静态代理和动态代理两种实现方式。本篇将重点讨论"动态代理",这是一种在运行时创建代理对象的技术,使得我们可以在程序运行过程中,根据需要动态地生成具有额外功能的代理类。 动态代理主要由...

    java jdk 动态代理 演示demo

    Java JDK 动态代理是一种强大的特性,它允许我们在运行时创建代理对象,这些代理对象可以扩展或增强已存在的接口实现。动态代理在处理AOP(面向切面编程)场景、事件监听、性能监控等方面有着广泛的应用。下面我们将...

    Java中的动态代理

    ### Java中的动态代理知识点解析 #### 一、动态代理概念 在Java中,动态代理是一种设计模式,它允许我们创建一个对象来代表另一个对象。这种模式通常用于在不修改目标对象的情况下,为对象添加额外的功能或者行为...

Global site tag (gtag.js) - Google Analytics