动态代理处理service
/* 动态代理处理service
* 1、动态代理的核心是切面编程,去除重复代码;
* 2、通过反射+注解可以灵活的获取传入对象内容;
* 3、通过try+catch将多个操作包裹,实现事物的原子性;
*
*/
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// TODO Auto-generated method stub
// 声明空对象
Object result = null;
// 通过方法获取真实实现类的调用方法
Method m = obj.getClass().getMethod(method.getName(), method.getParameterTypes());
// 获取调用方法的注解
Transactional annotation = m.getDeclaredAnnotation(Transactional.class);
// 判断注解为空则表示操作不是事物,无需满足原子性
if (annotation == null) {
System.out.println("非事务对象");
// 获取数据库接口
conn = SQLuntil.getConnection();
// 通过反射获取真实实现类的全部成员变量并遍历每个成员变量(即dao层接口实现类)
for (Field field : obj.getClass().getDeclaredFields()) {
// 允许访问私有成员变量
field.setAccessible(true);
// 获取dao层接口实现类对象
Object daoobj = field.get(obj);
// 通过反射获取dao层接口实现类对象的Connection对象
Field fconn = daoobj.getClass().getDeclaredField("conn");
// 允许访问私有成员变量
fconn.setAccessible(true);
// 为Connection对象赋值
fconn.set(daoobj, conn);
}
// 通过反射调取真实实现类方法并返回对应结果
result = method.invoke(obj, args);
// 关闭数据库接口
SQLuntil.close(conn);
}
// 判断存在注解表示操作对象是事物,需满足原子性更改为手动提交,如果过程中出现错误需要回滚
else {
try {
System.out.println("事务对象");
// 获取数据库接口
conn = SQLuntil.getConnection();
// 取消自动数据提交
conn.setAutoCommit(false);
// 通过反射获取真实实现类的全部成员变量并遍历每个成员变量(即dao层接口实现类)
for (Field field : obj.getClass().getDeclaredFields()) {
// 允许访问私有成员变量
field.setAccessible(true);
// 获取dao层接口实现类对象
Object daoobj = field.get(obj);
// 通过反射获取dao层接口实现类对象的Connection对象
Field fconn = daoobj.getClass().getDeclaredField("conn");
// 允许访问私有成员变量
fconn.setAccessible(true);
// 为Connection对象赋值
fconn.set(daoobj, conn);
}
// 通过反射调取真实实现类方法并返回对应结果
result = method.invoke(obj, args);
// 提交数据到数据库
conn.commit();
} catch (Exception e) {
// TODO: handle exception
// 捕获异常数据进行回滚
conn.rollback();
e.printStackTrace();
} finally {
// 关闭数据库接口
SQLuntil.close(conn);
}
}
return result;
}
动态代理处理service的更多相关文章
- 转账示例(四):service层面实现(线程管理Connection,AOP思想,动态代理)(本例采用QueryRunner来执行sql语句,数据源为C3P0)
用了AOP(面向切面编程),实现动态代理,service层面隐藏了开启事务.1.自行创建C3P0Uti,account数据库,导入Jar包 2.Dao层面 接口: package com.learni ...
- 【Java EE 学习 24 下】【注解在数据库开发中的使用】【反射+注解+动态代理在事务中的应用service层】
一.使用注解可以解决JavaBean和数据库中表名不一致.字段名不一致.字段数量不一致的问题. 1.Sun公司给jdbc提供的注解 @Table.@Column.@Id.@OneToMany.@One ...
- java中动态代理的实现
动态代理的实现 使用的模式:代理模式. 代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问.类似租房的中介. 两种动态代理: (1)jdk动态代理,jdk动态代理是由Java内部的反射机制 ...
- Spring中的cglib动态代理
Spring中的cglib动态代理 cglib:Code Generation library, 基于ASM(java字节码操作码)的高性能代码生成包 被许多AOP框架使用 区别于JDK动态代理,cg ...
- 【Java EE 学习 51】【Spring学习第三天】【cglib动态代理】【AOP和动态代理】【切入点表达式】
一.cglib动态代理 1.简介 (1)CGlib是一个强大的,高性能,高质量的Code生成类库.它可以在运行期扩展Java类与实现Java接口. (2) 用CGlib生成代理类是目标类的子类. (3 ...
- 【Java EE 学习 50】【Spring学习第二天】【使用注解的DI实现】【spring中的继承】【动态代理伪hibernate实现】
一.使用注解的DI实现 1.@Resource 使用该注解能够实现引用型属性的DI实现,该注解能够根据属性名和属性类型自动给属性赋值.一般使用@Resource(name="student& ...
- AOP学习心得&jdk动态代理与cglib比较
什么是AOP AOP(Aspect-OrientedProgramming,面向方面编程),可以说是OOP(Object-Oriented Programing,面向对象编程)的补充和完善.OOP引入 ...
- Java动态代理与Cglib库
JDK动态代理 代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托类之间通常会存在 ...
- Spring学习总结(二)——静态代理、JDK与CGLIB动态代理、AOP+IoC
一.为什么需要代理模式 假设需实现一个计算的类Math.完成加.减.乘.除功能,如下所示: package com.zhangguo.Spring041.aop01; public class Mat ...
随机推荐
- nodejs之connect
1.安装: npm install connect
- 【winform】datagridview获取当前行停留时间
RowStateChanged 的问题 RowStateChanged事件,也就是行状态发生变化时触发的事件,这个事件无法实现行号变化而触发这个要求,因为当我们从一行选择至另一行时,先触发原行号的状态 ...
- net core 部署到windows 服务
NSSM是一个服务封装程序,它可以将普通exe程序封装成服务,使之像windows服务一样运行.同类型的工具还有微软自己的srvany,不过nssm更加简单易用,并且功能强大.它的特点如下: 支持普通 ...
- 反转链表II(根据指定的索引,逆转链表)
反转从位置 m 到 n 的链表.请使用一趟扫描完成反转 思想:首先判断链表是否合法,并且判断输入的m和n是否合法 定义dummyHead结点,让它指向头结点的前驱,再定义cur,让它指向dummyHe ...
- web理论知识--网页访问过程(附有Django的web项目访问流程)
当我们闲暇之余想上网看看新闻,或者看个电影,通常的操作是:打开电脑.打开浏览器.输入网址.浏览页面信息.点击自己感兴趣的连接......那么有没有想过,这些网页从哪里来的?过程中计算机又做了什么事情了 ...
- webpack打包后的文件
用了webpack打包工具,你是不是有时会疑惑,写了一个很简单的函数,结果生成那么多东西,而且还没有问题?下面,我从三种情况来分析打包后的入口文件,帮助自己理解webpack打包,也为平时定位产出目录 ...
- WPF:解决数据绑定时不更新数据的问题
当用户在窗体控件中修改数据时,如果此时用户点击其它窗体会出现数据没有更新的情况. 这是由于数据绑定默认是通过失去焦点来提交数据的.可通过属性变更方法来更新数据: <TextBox.Text> ...
- 2019-2-20Sqlserver数据库中char、varchar、nchar、nvarchar的区别及查询表结构
varchar 和 nvarchar区别: varchar(n)长度为 n 个字节的可变长度且非 Unicode 的字符数据.n 必须是一个介于 1 和 8,000 之间的数值.存储大小为输入数据的字 ...
- ECMA Script 6_字符串_扩展_字符 是4字节还是2字节?_模板字符串
ES6 字符串扩展 ES6 加强了对 Unicode 的支持,并且扩展了字符串对象 字符 的 Unicode 表示法 允许采用 \uxxxx 形式表示一个字符, 其中 xxxx 表示字符的 Unico ...
- React 面向组件化编程 - 封装了webpack - npm run build 产生的包的 /static 引用路径问题
React 面向组件化编程 面向对象 ----> 面向模块 ----> 面向组件 套路: 注意: 组件名必须大写开头: 只能有一个根标签: <input />虚拟DOM 元素必 ...