?? connectionhandler.java
字號:
package org.adam.proxy;
import java.lang.reflect.*;
import java.sql.*;
import org.com.pool.*;
/**
* 采用了Dynamic Proxy模式來解決程序員的慣性動作---
* connection.close()---如果真正把連接關閉了,那么連接池的
* 的概念就不存在了,要做到真正重用,不是把連接關閉,而是要
* 使用完的連接重新放到池里,等待下次重用.所以,這里采用了
* 方法攔截器來實現這個connection.close()所帶來的關閉連接
* 問題.當客戶調用connection.close()將觸發方法攔截器,這個
* 時候就可以在invoke(...)方法里進行相關操作,如---把連接
* 重新放回連接池 !---Proxy模式比Decorator模式方便多了,
* 在此便是一個好例子,^_^
* @author Adam Email: yangjh@tarena.com
* @version 1.0.2
*
*/
public class ConnectionHandler implements InvocationHandler{
Connection dbconn;
TestConnectionPoolSecond pool;
public ConnectionHandler(TestConnectionPoolSecond pool){
this.pool = pool;
}
/**
* 將動態代理綁定到指定的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.returnConnection(Connection con)
* 方法作為標準close方法的替代!
*/
public Object invoke(Object proxy,Method method,Object[]args)throws Throwable{
Object obj = null;
//如果調用的是close方法,則永pool.returnConnection(Connection con)將其替換
if("close".equals(method.getName())){
pool.returnConnection(dbconn);
}else{
obj = method.invoke(dbconn,args);
}
return obj;
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -