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

如果不使用动态代理,则需要在每个方法本身里面设置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();
}
}

Java dynamical proxy demo的更多相关文章

  1. JAVA长连接demo

    http://blog.csdn.net/caomiao2006/article/details/38830475 JAVA长连接demo 2014-08-25 23:20 4767人阅读 评论(2) ...

  2. java中Proxy(代理与动态代理)

    转自: https://blog.csdn.net/pangqiandou/article/details/52964066 一.代理的概念 动态代理技术是整个java技术中最重要的一个技术,它是学习 ...

  3. 启动servlet报错:The servlets named [DemoServlet] and [main.java.com.wlf.demo.servlet.DemoServlet] are both mapped to the url-pattern [/hello] which is not permitted

    先看具体错误日志: [2019-04-26 09:29:25,484] Artifact demo-servlet:war: Artifact is being deployed, please wa ...

  4. Java反射机制demo(七)—反射机制与工厂模式

    Java反射机制demo(七)—反射机制与工厂模式 工厂模式 简介 工厂模式是最常用的实例化对象模式. 工厂模式的主要作用就是使用工厂方法代替new操作. 为什么要使用工厂模式?直接new不好吗? 直 ...

  5. Java反射机制demo(六)—获得并操作一个类的属性

    Java反射机制demo(六)—获得并操作一个类的属性 获得并操作一个类的属性?! 不可思议啊,一个类的属性一般都是私有成员变量啊,private修饰符啊! 但是毫无疑问,这些东西在Java的反射机制 ...

  6. Java反射机制demo(五)—获得并调用一个类中的方法

    Java反射机制demo(五)—获得并调用一个类中的方法 这个demo在使用反射机制操作属性之前,主要原因是因为在.class文件字节码中,方法排在属性的前面. 1,获得一个类中的方法 先看一下方法和 ...

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

    Java反射机制demo(四)—获取一个类的父类和实现的接口 1,Java反射机制得到一个类的父类 使用Class类中的getSuperClass()方法能够得到一个类的父类 如果此 Class 表示 ...

  8. Java反射机制demo(三)—获取类中的构造函数

    Java反射机制demo(三)—获取类中的构造函数 1,获取类中所有的构造函数 如下面的代码中所示,这个类中显式的构造函数有五个. 空构造: public UserInfo() 带参构造有四个: pu ...

  9. Java反射机制demo(二)—通过Class实例化任意类的对象

    Java反射机制demo(二)—通过Class实例化任意类的对象 上一章节中,实例化了Class类对象的实例,这个部分的demo展示了如何使用Class对象的实例去获得其他类的对象的实例. 任意一个类 ...

随机推荐

  1. 【循序渐进学Python】12.Python 正则表达式简介

    正表达式就是一段匹配文本片段的模式,在Python 中 re 模块包含了对正则表达式(regular expression)的支持. 1. 正则表达式的基本概念 1. 通配符 点号( . )可以匹配换 ...

  2. KTV点歌系统

    经过十多天的艰苦奋战,MyKTV点歌系统终于成型,从刚开始接到项目的茫然,到完成项目时的喜悦,整个过程的艰辛和付出只有自己知道.虽然这个项目还有许多需要完善的地方,譬如添加歌词信息,实现窗体的美化等, ...

  3. sql 随机抽取几条数据的方法 推荐

    传说用这个语句管用:select top 5 * from tablename order by newid() 我放到sql的查询分析器里去执行果然管用,随机抽取5条信息,不停的换,结果我应用到程序 ...

  4. solr 学习片段

    全文检索技术——Solr 1 主要内容 1.站内搜索技术选型 2.什么是solr Solr和lucene的区别 3.solr服务器的安装及配置 Solr整合tomcat Solr的演示 4.维护索引 ...

  5. 关于SQL Server的WITH(NOLOCK)和(NOLOCK)

    The difference is that you should be using the syntax WITH (NOLOCK) (or WITH (<any table hint> ...

  6. expect入门--自动化linux交互式命令

    很多linux程序比如passwd,ftp,scp,ssh等自身并没有提供一种静默式的执行选项,而是依赖于运行时的终端输入来进行后一步的操作比如更改密码.文件上传.下载等.虽然有些编程语言如java嵌 ...

  7. 常用 windows运行命令

    winver---------检查Windows版本 wmimgmt.msc----打开windows管理体系结构(WMI) wupdmgr--------windows更新程序 wscript--- ...

  8. SharePoint 2013 中自定义WCF服务

    在使用SharePoint2013的时候,如果其他客户端 API 的组合不足,可以通过自定义 Web 服务扩展 SharePoint.默认情况下,SharePoint 2013 不仅支持创建自定义 A ...

  9. 关于配置并发访问的服务器apache、nginx

    一. apache,nginx比较     关于Apache与Nginx的优势比较  (apache计算密集型   nginx io密集型  各有优势,不存在谁取代谁) 二.nginx 基于nginx ...

  10. node.js之看懂package.json依赖库版本控制

    金天:学习一个新东西,就要持有拥抱的心态,如果固守在自己先前的概念体系,就会有举步维艰的感觉.node.js依赖库的版本控制 一般node.js项目会依赖大量第三方module, 那么如何控制modu ...