动态代理处理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 ...
随机推荐
- hash与encrypt
概括来说,哈希(Hash)是将目标文本转换成具有相同长度的.不可逆的杂凑字符串(或叫做消息摘要),而加密(Encrypt)是将目标文本转换成具有不同长度的.可逆的密文. 具体来说,两者有如下重要区别: ...
- 金蝶K/3 固定置产相关SQL语句
金蝶K/3 固定置产相关SQL语句 select * from vw_fa_card --固定置产打印原始数据 select FAssetID,FAssetNumber,FAssetName,FGro ...
- 移动 ProgramData\Package Cache 文件夹
装完vs2017 发现C盘快木有空间了… 瞅瞅C盘下有啥能删的好释放下空间 就找到了 Package Cache 文件夹,占用空间接近15G… 查查这个文件夹还不建议删除… (http://super ...
- Consideration about improving mathematics study
In this article, I’ll present my ideas about how to improve mathematics study, which are the forewor ...
- Python中append()与extend()的区别
列表方法append()和extend()之间的差异: append:在最后追加对象 x = [1, 2, 3] x.append([4, 5]) print (x) 结果 [1, 2, 3, [4, ...
- python经典书籍必看:流畅的Python
作者:熊猫烧香 链接:www.pythonheidong.com/blog/article/26/ 来源:python黑洞网 目标读者 本书的目标读者是那些正在使用 Python,又想熟悉 Pytho ...
- IMCASH:看着朋友赚钱进币圈 我凭啥亏钱? 4月29日币圈报告
即将过去的四月份,币圈的行情总体是不错的,比特从4000附近最高涨到了5600以上的位置,当前也在5200左右,而成交量更是创出历史天量(4月3日,全球加密货币市场的交易量达890亿美元,创历史天量) ...
- 水晶报表,快速报表,rdlc报表
感觉自己脑子里只剩下报表了,o(╥﹏╥)o.因为最近新换了公司,业务上有需要报表打印,水晶报表,快速报表,rdlc报表这三种以后可能都会用到.所以在没了解好业务流程,熟悉代码之前,就是看看这三种报表怎 ...
- 2017-11-4—LTspice
LTspice这个软件基本上上手就能用,没什么好说的. ADI的一些器件下载的spice文件可能是.cir的需要使用cadence的pspice软件打开后另存为.dir文件使用.(比如ad4096) ...
- 04-JQuery
今日任务 使用JQuery完成页面定时弹出广告 定时器: setInterval clearInterval setTimeout clearTimeout 显示: ...