动态代理的事务封装

         在上篇博客中介绍了使用ThreadLocal维护Connection的方法,这样做的最大的优点就是不用来回的传递Connection了,可是我们有会发如今我们使用事务的时候不可避免的会写很多反复的代码,这些都是与业务逻辑无关的:          

        Connection conn = ConnectionManage.GetConnection();ConnectionManage.beginTransaction(conn); ConnectionManage.commitTransaction(conn);//等等代码。

//以及Catch中的事务回滚,和finally中关闭连接等等


 

 

        不仅不合理。并且是反复劳动,程序开发的一个原则就是杜绝反复劳动。做到良好的封装。

        这里,我们就採用动态代理对事务进行封装,使我们的业务逻辑层不再出现有关事务的代码。

package com.hanyi.drp.util;import java.lang.reflect.InvocationHandler;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.sql.Connection;/*** 使用动态代理封装事务* @author hanyi**/
public class TransactionHandler implements InvocationHandler {private Object targetObject;/*** 获取目标类的代理* @param targetObject* @return*/public Object newProxyInstance(Object targetObject) {this.targetObject = targetObject;return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(),targetObject.getClass().getInterfaces(), this);}/*** 代理方法。调用目标类方法前先调用该方法*/@Overridepublic Object invoke(Object proxy, Method method, Object[] args)throws Throwable {Connection conn = null;Object ret = null;try {// 从ThreadLocal中取得Connection。ConnectionManage是对connection的封装conn = ConnectionManage.GetConnection();//假设是以add,del,modify开头的方法,则手动开启事务if (method.getName().startsWith("add")|| method.getName().startsWith("del")|| method.getName().startsWith("modify")) {// 手动控制事务提交ConnectionManage.beginTransaction(conn);}// 调用目标对象的业务逻辑方法ret = method.invoke(targetObject, args);//假设事务为手动提交方式,则手动提交事务if (!conn.getAutoCommit()) {// 提交事务ConnectionManage.commitTransaction(conn);}} catch (Exception e) {//假设事务为手动提交方式。则手动回滚事务if (!conn.getAutoCommit()) {// 回滚事务ConnectionManage.rollbackTransaction(conn);}e.printStackTrace();if (e instanceof InvocationTargetException) {InvocationTargetException ete = (InvocationTargetException) e;throw ete.getTargetException();}throw new Exception("操作失败!");} finally {//关闭连接ConnectionManage.closeConnection();}return ret;}}

原理:当我们在工厂中获取业务逻辑层对象的时候,我们获取的并非目标对象。而是目标对象的代理,代理替我们管理事务的开启。提交。回滚,与关闭

 

在工厂中用动态代理包装业务逻辑对象

public synchronized Object GetServiceBean(Class c) {  if (ServiceMap.containsKey(c.getName())) {  return ServiceMap.get(c.getName());  }  Element beanEle = (Element) doc.selectSingleNode("//Service[@id=\""  + c.getName() + "\"]");  String className = beanEle.attributeValue("class");  // System.out.print(className);  Object serviceBean = null;  try {  serviceBean = Class.forName(className).newInstance();  //採用动态代理包装Service  TransactionHandler transactionHandler = new TransactionHandler();  //得到代理  serviceBean = transactionHandler.newProxyInstance(serviceBean);  ServiceMap.put(c.getName(), serviceBean);  } catch (Exception e) {  throw new RuntimeException();  }  return serviceBean;  }  
在详细的使用过程中,获取的并非目标对象,而是目标对象的代理。


userManager = (UserManager) getBeanFactory().GetServiceBean(UserManager.class); 


版权声明:本文博客原创文章,博客,未经同意,不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/263131.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

EF 从sqlserver2008 迁移到 2005出现的BUG

在VS10Server08中使用EF4.4,发布数据库为SQL05,发生错误的问题 问题描述环境描述:工具为VS2010SQL08 R2,EntityFramework版本为4.4(在Framework4.5中为5.0),在本机完全测试完成后,发…

[新闻]Ubuntu7.04于4月19日全球同步发布

[新闻]Ubuntu7.04于4月19日全球同步发布!!!鼓掌欢迎,准备更新!!!http://www.ubuntu.com/转载于:https://www.cnblogs.com/cime63/archive/2007/04/19/720131.html

解决Docker构建时出现的 WARNING: Ignoring https://dl-cdn.alpinelinux.org/alpine/v3.13/main: Permission denied

解决Docker构建时出现的 WARNING: Ignoring https://dl-cdn.alpinelinux.org/alpine/v3.13/main: Permission denied在根据官网的Docker-compose构建示例项目时遇到的问题,原因是因为无法访问官网给出的外网镜像,可能还会出现WARNING: Ignoring https://…

可耻的客户端,可怕的征兆,必须趁早消灭它

最近在我的Android手机上安装一个小软件,不知为何,顶部的消息提示有软件推荐,最开始还以为是某些软件的更新提示,于是点击一次,却发现直接安装该软件。当时我感到非常愤怒。真是一个可耻的程序员做了一个可耻的客户端&…

Table还是CSS,请您说说您的见解

这两天在对网页进行排版,可是觉得Table总是很烦,后来使用CSS,可是CSS也有CSS的问题,无论是什么好像都不能十全十美。请朋友们发现您的意见,您觉得如何? 转载于:https://www.cnblogs.com/edrp/archive/2007/…

Google Android开发精华教程

Android是Google于2007年11月5日宣布的基于Linux平台的开源手机操作系统的名称,该平台由操作系统、中间件、用户界面和应用软件组成,号称是首个为移动终端打造的真正开放和完整的移动软件。本文汇总整理了时下关于Google Android技术教程的下载资源&…

转盘不转动的问题

2019独角兽企业重金招聘Python工程师标准>>> Stack Overflow is a question and answer site for professional and enthusiast programmers. Its 100% free, no registration required. jQuery Rotate - IE7 & IE8 Issues up vote 11 down vote favorite 3 I a…

主机无法连接虚拟机中的redis服务

解决&#xff1a;主机<本地>无法连接虚拟机中的redis服务首先保证虚拟机网络已经和主机网络互通&#xff0c;即相互ping对方IP&#xff0c;能ping通但是仍然连不上redis服务&#xff0c;可能是以下问题。redis服务配置问题 配置redis.conf如下 protected-mode no #关闭…

重构机房收费系统(二)

接上篇《机房收费系统重构&#xff08;一&#xff09;》 二、概要设计 完成了用例图&#xff0c;并用结合用例图完善了一下需求分析说明书&#xff0c;忘记是第几次修订需求分析说明书。有了用例图&#xff0c;很自然就进入了概要设计阶段。我认为这一阶段就是结合包图解决系统…

VS 2005 安装一个的小问题

今天通过 添加/删除 安装了VC的部分功能之后&#xff0c;在 程序》Visual Studio 2005 》Visual Studio 2005 Tools 里面竟然找不到 ActiveX Control Test Container 了&#xff0c;但是却有 Spy和 MFC-ATL Trace Tool&#xff0c;建了MFC ActiveX功能在IDE里面 工具 菜单中也找…

《Windows核心编程》学习笔记(9)– 在win7或者vista系统下提升一个进程的运行权限...

win7或者vista默认运行程序是在受限制的环境下运行的&#xff0c;以减轻病毒对于系统的破坏。那么我们怎样才能提升一个进程的权限以至让它在 管理员模式下运行。当然CreateProcess函数没有提供这个功能。相反我们需要调用的是ShellExecuteEx函数&#xff1a; BOOL ShellExecu…

2015第29周二AOP

1、问题&#xff1a;想要添加日志记录、性能监控、安全监测 2、最初解决方案2.1、最初解决方案&#xff1a;在每个需要的类函数中重复写上面处理代。 缺点&#xff1a;太多重复代码&#xff0c;且紧耦合2.2、抽象类进行共性设计&#xff0c;子类进行个性设计&#xff0c;此处不…

Docker-compose配置Mysql,Redis,MongoDB

Docker-compose下配置Mysql&#xff0c;Redis&#xff0c;MongoDB详解一、docker-compose简介二、构建一个实例项目1.前后端实现2.Dockerfile及docker-compose.yml3. 生成镜像三、实例程序源码一、docker-compose简介 Compose是用于定义和运行多容器Docker应用程序的工具。通过…

初学者应该了解的一些SQL语句及hr 用户解锁相关

初学者应该了解的一些SQL语句 1.显示当前连接用户SQL> show user&#xff1b; 2.查看系统拥有哪些用户SQL> select * from all_users; 3.连接到新用户SQL> conn 用户名/密码 4.查询当前用户下所有对象SQL> select * from tab; 5.建立第一个表SQL> create table …

用Delphi 6开发ASP上传组件详解

文件上传是WEB开发中经常要用到的功能&#xff0c;但ASP本身和内置的组件都不支持文件上传功能。网上流传的一些第三方组件虽然能够解决这个问题&#xff0c;但大多是要收费的&#xff0c;更别说Open Source了。本文将详细剖析WEB文件上传的原理&#xff0c;以及一步步指导读者…

使用WebDeployment Project改善VS2005发布网站问题

VS2005发布网站时不会像VS2003一样生成规则的DLL文件、而生成的DLL文件名含有随机数且不能一个项目生成一个DLL文件、让人有一些遗憾、为了做到像vs2003一样&#xff0c;微软发布了WebDeployment Project插件可解决此问题&#xff1a;下载地址1、下载后安装、右键选择vs2005中的…

03 - const static extern

const是一个C语言的关键字&#xff0c;它限定一个变量不允许被改变。使用const可以在一定程度上提高程序的安全性和可靠性&#xff0c;再者在看别人的代码作品的时候也可以有助于清晰理解const所起的作用。 1、const和#define的区别 &#xff08;1&#xff09;编译器处理的方式…

Linux、Windows、Mac下Docker的安装与使用

Linux、Windows、Mac下Docker的安装与使用一、Linux下的安装二、Windows与Mac下的安装三、Docker的使用一、Linux下的安装 这里以Centos 7为例&#xff0c;首先&#xff0c;确保系统已经正确运行了Centos 7并已经联网。yum安装gcc环境 yum -y install gcc yum -y install gcc…

[智能架构系列]什么是Buddy智能开发框架

buddy框架&#xff0c;秉承国内优秀框架THINKPHP的优点并增加了很多的商业特性和集成了全版本的商业项目模块&#xff0c;提供给创业者一个最好的选择 组建图: 转载于:https://www.cnblogs.com/scotoma/archive/2011/10/17/2215553.html

Mac nginx PCRE install ngnix

1 下载&#xff1a;pcre-8.12.tar.gz ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre 2 sudo tar xvfz pcre-8.12.tar.gz 解压文件 解压完成之后&#xff0c;执行命令 cd pcre-8.12sudo ./configure --prefix/usr/local --enable-utf8 sudo make sudo make instal…