LOFTER for ipad —— 让兴趣,更有趣

点击下载 关闭
Spring 动态代理 part1
Nowakii 2018-10-15

实现接口InvocationHandler

public class UserHandler implements InvocationHandler {

private Object obj;


public UserHandler(Object obj) {

this.obj = obj;

}


@Override

public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {


System.out.println("before");

Object result = method.invoke(obj, args);

System.out.println("after");

return result;

}

}

数据库连接池核心代码

/**

 * 

 */

package com.hpe.util;


import java.io.InputStream;

import java.io.PrintWriter;

import java.lang.reflect.InvocationHandler;

import java.lang.reflect.Method;

import java.lang.reflect.Proxy;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.SQLException;

import java.sql.SQLFeatureNotSupportedException;

import java.util.LinkedList;

import java.util.List;

import java.util.Properties;

import java.util.logging.Logger;


import javax.sql.DataSource;


/** 

 * 类描述:

 * 作者:Λrisa

 * 创建日期:2018年10月15日  

 */

public class DataSourcePoolProxy implements DataSource{

private static LinkedList<Connection> List =new LinkedList<Connection>();

static{

InputStream in = DataSourcePoolProxy.class.getClassLoader().getResourceAsStream("db.properties");

Properties prop = new Properties();

try {

prop.load(in);

String driver = prop.getProperty("driver");

System.out.println(driver);

String url = prop.getProperty("url");

String user = prop.getProperty("user");

String password = prop.getProperty("password");


Class.forName(driver);

// 初始化10个Connection

for (int i = 0; i < 10; i++) {

Connection conn = DriverManager.getConnection(url, user, password);

List.add(conn); // 将conn对象添加容器中

}

} catch (Exception e) {

e.printStackTrace();

throw new ExceptionInInitializerError(e);

}

}

/* (non-Javadoc)

 * @see javax.sql.CommonDataSource#getLogWriter()

 */

@Override

public PrintWriter getLogWriter() throws SQLException {

// TODO Auto-generated method stub

return null;

}

/* (non-Javadoc)

 * @see javax.sql.CommonDataSource#setLogWriter(java.io.PrintWriter)

 */

@Override

public void setLogWriter(PrintWriter out) throws SQLException {

// TODO Auto-generated method stub

}

/* (non-Javadoc)

 * @see javax.sql.CommonDataSource#setLoginTimeout(int)

 */

@Override

public void setLoginTimeout(int seconds) throws SQLException {

// TODO Auto-generated method stub

}

/* (non-Javadoc)

 * @see javax.sql.CommonDataSource#getLoginTimeout()

 */

@Override

public int getLoginTimeout() throws SQLException {

// TODO Auto-generated method stub

return 0;

}

/* (non-Javadoc)

 * @see javax.sql.CommonDataSource#getParentLogger()

 */

@Override

public Logger getParentLogger() throws SQLFeatureNotSupportedException {

// TODO Auto-generated method stub

return null;

}

/* (non-Javadoc)

 * @see java.sql.Wrapper#unwrap(java.lang.Class)

 */

@Override

public <T> T unwrap(Class<T> iface) throws SQLException {

// TODO Auto-generated method stub

return null;

}

/* (non-Javadoc)

 * @see java.sql.Wrapper#isWrapperFor(java.lang.Class)

 */

@Override

public boolean isWrapperFor(Class<?> iface) throws SQLException {

// TODO Auto-generated method stub

return false;

}

/* (non-Javadoc)

 * @see javax.sql.DataSource#getConnection()

 */

@Override

public Connection getConnection() throws SQLException {

//说明有可用的链接

synchronized(List){

if(List.size()>0){

/**

 * 如果调用的方法主要使用子类实现的方法,不用向上转型

 * 如果主要使用父类 父接口的方法 则使用向上转型

 */

final Connection conn=List.removeFirst();

    Object obj=Proxy.newProxyInstance(DataSourcePoolProxy.class.getClassLoader(),new Class[]{Connection.class}, new InvocationHandler(){ 

@Override

public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

if("close".equals(method.getName())){

List.add(conn);

return null;

}else{

return method.invoke(conn, args);

}

}

});

return (Connection) obj;

}

return null;

}

}

/* (non-Javadoc)

 * @see javax.sql.DataSource#getConnection(java.lang.String, java.lang.String)

 */

@Override

public Connection getConnection(String username, String password) throws SQLException {

return null;

}

}

配置好bean(servlet,service,dao)

把BeanFactory初始化即可,DI依赖注入数据

什么时候调用?拦截请求,调用前获取bean,getBean



推荐文章
评论(0)
分享到
转载我的主页