动态代理处理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 ...
随机推荐
- jquery 第五章 jQuery操作表单与表格
1.回顾 对象.bind("事件名称",function(){ // }) 阻止冒泡事件 return false, event stopProapagation() 模拟事件 ...
- Nginx Linux详细安装部署教程
一.Nginx简介 Nginx是一个web服务器也可以用来做负载均衡及反向代理使用,目前使用最多的就是负载均衡,具体简介我就不介绍了百度一下有很多,下面直接进入安装步骤 二.Nginx安装 1.下载N ...
- spring boot vuejs
项目介绍 Spring Boot 2.0 + VueJs 2.0 开发项目示例 GitHub: https://github.com/fqybzhangji/spring-boot-vue 码云: h ...
- vuejs使用jsx语法
想要vuejs项目支持jsx语法,需要一些插件 babel-plugin-transform-vue-jsx Babel plugin for Vue 2.0 JSX 使用方法: 安装 npm ins ...
- 期货大赛项目|十,MVC对js和css的压缩
在Global.asax中添加两行代码 //默认在调试期间,不会启用js和css的压缩 //下面的语句确保了在调试期间也压缩css和js BundleTable.EnableOptimizations ...
- hihocoder 1496 寻找最大值
题解: 注意到$ai$只有$1e6$这件事情肯定要枚举和这个有关的东西 考虑枚举$ai\&aj$的值就可以了 那么这个集合一定是ai,aj的子集 于是我们对每个集合从大到小枚举丢掉一位转移就行 ...
- day11.装饰器初识
1.开放封闭原则 原则: 开放封闭原则,对扩展是开放的,对修改是封闭的. 封版概念:当写好一个功能以后,就不可以再修改此函数,避免下面一系列的调用产生错误. 因此产生了装饰器 2.装饰器形成过程 我们 ...
- UOJ#405. 【IOI2018】组合动作
原文链接https://www.cnblogs.com/zhouzhendong/p/IOI2018Day1T1.html 题解 首先二分一下,花费2次操作求出第一位的字符. 假设第一个字符是 Y,答 ...
- 001 python基础实战
报名了阿里大学的AI,一直没有学习,今天开始正式学习. 今天是第一节,Python的基础编程实战,里面包含两个示例. 一:任务实现文件的批量重命名. 1.创建一个目录 2.程序 #!/usr/bin/ ...
- mysql命令之工作小结
1.登客户端 mysql -u userName -p password -h ip 注:u 用户名 p 密码 h ip地址 2.修改密码 UPDATE mysql.u ...