1.写一个子类,覆盖close方法(由于传递的对象封装了大量的信息,不可行)
2.写一个connection的包装类,增强close方法(可以,但是有的代码量大)
3.用动态代理,返回一个代理对象出去,拦截close方法的调用,对close方法进行增强
(可以使用BDCP或者C3P0)
--用包装设计模式对某个对象进行增强
1.写一个类,实现与被增强对象相同的接口
2.定义一个变量,指向被增强对象
3.定义一个构造方法,接受被增强对象
4.覆盖需要增强的方法
5.对于不需要增强的方法,直接调用被增强对象的方法
eg:
class MyConnection implements Connection {
private Connection conn;
private List<Connection> pool;
public MyConnection(Connection conn, List<Connection> pool) {
this.conn = conn;
this.pool = pool;
}
@Override
public void close() throws SQLException {
pool.add(conn);
}
@Override
不需要覆盖的直接调用原来的方法
}
--动态代理
@Override
public Connection getConnection() throws SQLException {
if (list.size() > 0) {
Connection conn = list.removeFirst();
//return new MyConnection(conn, list);
return (Connection) Proxy.newProxyInstance(JdbcPool.class.getClassLoader(), conn.getClass().getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if(!method.getName().equals("close")){
return method.invoke(conn, args);
}else{
return list.add(conn);
}
}
});
} else {
throw new RuntimeException("DB busy");
}
}