InvocationHandler的一个例子

来源:互联网 发布:开淘宝店铺步骤 编辑:程序博客网 时间:2024/04/27 19:54

InvocationHandler的一个例子

http://blog.csdn.net/linminqin/article/details/6313348

《深入浅出Hibernate》中有个JDBC运用InvocationHandler的例子

例子环境:

使用动态代理,在开发人员使用close()方法的时候,不是使用java的Connection的close方法,而是使用自定义的数据库连接池类的close()方法

Public class ConnectionHandler implements InvocationHandler {      Connection dbConn;      ConnectionPool connPool; //自定义线程池借口             public ConnectionHandler(ConnectionPool connPool) {          this.connPool = connPool;      }      /**      * 将动态代理绑定到指定Connection      * @param conn      * @return 绑定后的Connection      */      public Connection bind(Connection conn) {          this.dbConn= conn;          Connection proxyConn = (Connection)Proxy.NewProxyInstance(conn.getClass().getClassLoader(), conn.getClass().getInterFaces(), this);          return proxyConn ;      }      /*      * 方法调用拦截器      * 判断当前调用的方法是否"close"方法      * 如果是,则调用pool.releaseConnection方法作为标准close方法的替代      */      public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {          Object obj = null;          //如果调用的事close()方法,则用pool的releaseConnection方法将其替换掉           if("close".equals(method.getName())) {              pool.releaseConnection(dbConn);          } else {              obj = method.invoke(dbConn, args);          }          return obj;      }  }  


配合Dynamic Proxy模式,DBConnectionPool.getConnection方法也做了一点小小的修改

public synchronized Connection getConnection() throws DBException {      if(pool == null) {          pool = new Vector();      }      Connection conn;      if(pool.isEmpty()) {          conn = createConnection();      } else {          int lastIndex = pool.size() - 1;          conn = pool.get(lastIndex);          pool.remove(pool.get(lastIndex));      }      ConnectionHandler connHandler = new ConnectionHandler(this);      return connHandler.bind(conn);  }  

原创粉丝点击