Java dynamical proxy demo

今天练习了一下动态代理的一个方面,假设使用它来完成自动设置默认不提交,启动事务,获取到异常则回滚,正常执行则提交。

如果不使用动态代理,则需要在每个方法本身里面设置Connection,写try,catch语句,重复的工作。

为什么要使用动态代理?

我们的业务层可以更加专注于业务本身,把其他相关的活抽象出来共同处理,如日志处理和异常处理等。这样的代码更干净。

代码示例如下:

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;

interface DAO {
    public Connection GetConn(String url) throws SQLException;

    public void InsertData();

    public void GetData();

    public void DeleteData();
}

class myops implements DAO {
    @Override
    public void InsertData() {
        System.out.println("inserting data...");
    }

    @Override
    public void GetData() {
        System.out.println("getting data...");
    }

    @Override
    public void DeleteData() {
        System.out.println("deleting data...");
    }

    @Override
    public Connection GetConn(String url) throws SQLException {
        try {
            Class.forName("oracle.jdbc.driver.OracleDriver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        Connection conn = null;
        conn = DriverManager
                .getConnection("jdbc:oracle:thin:@hostip:port:dbname",
                        "system", "pwd");
        return conn;
    }
}

class dynamicalproxy implements InvocationHandler {
    Object proxied;
    Connection conn;

    public dynamicalproxy(Object _proxied, Connection _conn) {
        proxied = _proxied;
        conn = _conn;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args)
            throws Throwable {
        Object rtv = null;
        conn.setAutoCommit(false);
        System.out.println("doing something before what ...");
        try {
            rtv = method.invoke(proxied, args);
        } catch (Exception ex) {
            conn.rollback();
            ex.printStackTrace();
        } finally {
            conn.commit();
            System.out.println("commit tran ...");
        }
        System.out.println("doing something after what ...");
        return rtv;
    }
}

public class proxydemo {
    public static void main(String[] args) throws IllegalArgumentException,
            SQLException {
        myops test = new myops();
        DAO dao = (DAO) Proxy.newProxyInstance(DAO.class.getClassLoader(),
                new Class[] { DAO.class },
                new dynamicalproxy(test, test.GetConn("")));
        dao.InsertData();
        dao.GetData();
        dao.DeleteData();
    }
}

posted on 2015-02-28 06:43  tneduts  阅读(153)  评论(0编辑  收藏  举报

导航