前言:
第一步还是先自定义,了解底层如何实现,再去运用工具组件
自定义连接池:
主要是用到了动态代理,和反射
使用动态代理
,可以监测接口中方法的执行
(一旦方法被执行就可以执行额外添加的功能)
Proxy
static Object newProxyInstance(
//当前使用的类加载器
ClassLoader loader,
//目标对象(Connection)实现的接口类型
Class<?>[] interfaces,
事件处理器:当执行上面接口中的方法的时候,就会自动触发事件处理器代码,把当前执行的方法(method)作为参数传入。
InvocationHandler h
)
动态代理总结:
使用代理,可以在不实现接口的情况,对接口的方法进行扩展,
添加额外的用户需要的业务逻辑!
public class pool {
private int init_count = 3;
private int max_count = 6;
private int current_count = 0;
private String url = "jdbc:mysql://localhost:3306/day15?serverTimezone=Asia/Shanghai&useUnicode=tr";
private LinkedList<Connection> pool = new LinkedList<Connection>();
public pool() {
for (int i = 0; i < init_count; i++) {
current_count++;
Connection connection = createConnection();
pool.addLast(connection);
}
}
private Connection createConnection() {
try {
Class.forName("com.mysql.cj.jdbc.Driver");
// 原始的目标对象
final Connection connection = DriverManager.getConnection(url, "root", "123456");
//
Class[] xx=connection.getClass().getInterfaces();
for(int i=0;i<xx.length;i++) {
System.out.println(xx[i].getName());
}
Connection proxy = (Connection) Proxy.newProxyInstance(
// 类加载器
connection.getClass().getClassLoader(),
// connection.getClass().getInterfaces(),当目标对象是一个具体的类时
// 目标对象实现的接口,如上getInterfaces()也可以
new Class[] { Connection.class },
//当调用connection对象方法的时候, 自动触发事务处理器
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object result = null;
String methodName = method.getName();
if ("close".equals(methodName)) {
System.out.println("当前执行close方法");
realeaseConnection(connection);
System.out.println("当前连接放入连接池");
} else {
//// 调用目标对象方法
result = method.invoke(connection, args);
}
return result;
}
});
return proxy;
} catch (Exception e) {