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();
    }
}
时间: 2024-11-05 18:43:37

Java dynamical proxy demo的相关文章

Exception in thread "main" java.lang.NoClassDefFoundError: Demo (wrong name: com/zhangyun/Demo)解决办法

介绍一个Java初学者可能会遇到的问题 首先,创建一个类,如下: 文件名:Demo.java package com.zhangyun; public class Demo { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub System.out.println("Hello World!"); } } 然后我找到对应在磁盘的位置,如下: E

java代理Proxy

首先是静态代理: 1 public class Test1 { 2 3 public static void main(String[] args) { 4 IA a = new APoxy(new A()); 5 a.doJob(); 6 } 7 8 } 9 //功能接口 10 interface IA{ 11 public void doJob(); 12 } 13 //委托类 14 class A implements IA{ 15 16 @Override 17 public void

java mail发送邮件demo 代码

java mail发送邮件demo,引入mail.jar,运行测试发送ok[代码][Java]代码     01import java.util.Date;02import java.util.Properties;0304import javax.mail.Authenticator;05import javax.mail.Message;06import javax.mail.MessagingException;07import javax.mail.PasswordAuthenticat

JAVA长连接demo

http://blog.csdn.net/caomiao2006/article/details/38830475 JAVA长连接demo 2014-08-25 23:20 4767人阅读 评论(2) 收藏 举报  分类: JAVA(161)  [java] view plain copy package houlei.csdn.keepalive; import java.io.Serializable; import java.text.SimpleDateFormat; import ja

Java反射机制demo(四)—获取一个类的父类和实现的接口

Java反射机制demo(四)—获取一个类的父类和实现的接口 1,Java反射机制得到一个类的父类 使用Class类中的getSuperClass()方法能够得到一个类的父类 如果此 Class 表示 Object 类.一个接口.一个基本类型或 void,则返回 null.如果此对象表示一个数组类,则返回表示该 Object 类的 Class 对象. 测试代码: package com.aaron.reflect; public class Demo4 { public static void

java反序列化原理-Demo(一)

java反序列化原理-Demo(一) 0x00 什么是java序列化和反序列? Java 序列化是指把 Java 对象转换为字节序列的过程便于保存在内存.文件.数据库中,ObjectOutputStream类的 writeObject() 方法可以实现序列化.Java 反序列化是指把字节序列恢复为 Java 对象的过程,ObjectInputStream 类的 readObject() 方法用于反序列化. 0x01 java反序列漏洞原理分析 首先先定义一个user类需继承Serializabl

org.springframework.beans.BeanInstantiationException: Failed to instantiate [demo.Words]: No default constructor found; nested exception is java.lang.NoSuchMethodException: demo.Words.<init>()

org.springframework.beans.BeanInstantiationException: Failed to instantiate [demo.Words]: No default constructor found; nested exception is java.lang.NoSuchMethodException: demo.Words.<init>()或者是: org.springframework.beans.BeanInstantiationException

Java SPI及Demo

首先交代下背景,何为Java SPI?SPI 全称为 (Service Provider Interface) ,是JDK内置的一种服务提供发现机制. 为什么需要SPI? 我们的现代系统越来越庞大,如果设计架构有问题,就可能牵一发而动全身,在面向对象中我们推荐基于接口编程,模块之间基于接口编程,这样的好处显而易见,不在代码中进行硬编码,不同的实现者按照接口规范实现自己内部操作,然后在使用的时候再根据 SPI 的规范去获取对应的服务提供者的服务实现.通过 SPI 服务加载机制进行服务的注册和发现,

java中Proxy类初探

在java中提供了一个动态代理类,这个类位于java.lang.reflect包中的Proxy类中.什么是动态代理类呢?就是可以在运行时创建一个实现了一组给定接口的新类.听上去有点高深的样子,其实是提供了一种类的包装器,最终对接口中方法的调用还是由现有的接口的实现类去调用. 比如,现在有一个ArrayList的对象,可以向其中添加任意的string对象,但是我们不需要添加apple这个字符串.ArrayList默认是不会提供这种字符串过滤的方法的,这个时候我们就可以使用Proxy代理类,在这个类