/* 动态代理处理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的更多相关文章

  1. 转账示例(四):service层面实现(线程管理Connection,AOP思想,动态代理)(本例采用QueryRunner来执行sql语句,数据源为C3P0)

    用了AOP(面向切面编程),实现动态代理,service层面隐藏了开启事务.1.自行创建C3P0Uti,account数据库,导入Jar包 2.Dao层面 接口: package com.learni ...

  2. 【Java EE 学习 24 下】【注解在数据库开发中的使用】【反射+注解+动态代理在事务中的应用service层】

    一.使用注解可以解决JavaBean和数据库中表名不一致.字段名不一致.字段数量不一致的问题. 1.Sun公司给jdbc提供的注解 @Table.@Column.@Id.@OneToMany.@One ...

  3. java中动态代理的实现

    动态代理的实现 使用的模式:代理模式. 代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问.类似租房的中介. 两种动态代理: (1)jdk动态代理,jdk动态代理是由Java内部的反射机制 ...

  4. Spring中的cglib动态代理

    Spring中的cglib动态代理 cglib:Code Generation library, 基于ASM(java字节码操作码)的高性能代码生成包 被许多AOP框架使用 区别于JDK动态代理,cg ...

  5. 【Java EE 学习 51】【Spring学习第三天】【cglib动态代理】【AOP和动态代理】【切入点表达式】

    一.cglib动态代理 1.简介 (1)CGlib是一个强大的,高性能,高质量的Code生成类库.它可以在运行期扩展Java类与实现Java接口. (2) 用CGlib生成代理类是目标类的子类. (3 ...

  6. 【Java EE 学习 50】【Spring学习第二天】【使用注解的DI实现】【spring中的继承】【动态代理伪hibernate实现】

    一.使用注解的DI实现 1.@Resource 使用该注解能够实现引用型属性的DI实现,该注解能够根据属性名和属性类型自动给属性赋值.一般使用@Resource(name="student& ...

  7. AOP学习心得&jdk动态代理与cglib比较

    什么是AOP AOP(Aspect-OrientedProgramming,面向方面编程),可以说是OOP(Object-Oriented Programing,面向对象编程)的补充和完善.OOP引入 ...

  8. Java动态代理与Cglib库

    JDK动态代理 代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托类之间通常会存在 ...

  9. Spring学习总结(二)——静态代理、JDK与CGLIB动态代理、AOP+IoC

    一.为什么需要代理模式 假设需实现一个计算的类Math.完成加.减.乘.除功能,如下所示: package com.zhangguo.Spring041.aop01; public class Mat ...

随机推荐

  1. SpringBoot webmvc项目导出war包并在外部tomcat运行产生的诸多问题以及解决方案

    背景: 有需求要将原来的Spring(3.2.6) + Springmvc + Hibernate项目重构为Springboot(1.5.2)项目 描述: 记录重构过程,以及期间遇到的种种问题和对应的 ...

  2. Cmder--cmd的替代工具

    安装包 Version: v1.3.11 https://share.weiyun.com/5WIRPvx 添加至右键菜单 进入cmder的根目录执行注册要右键菜单即可. C:\Windows\sys ...

  3. numpy的array合并-【老鱼学numpy】

    概述 本节主要讲述如何把两个数组按照行或列进行合并. 按行进行上下合并 例如: import numpy as np a = np.array([1, 1, 1]) b = np.array([2, ...

  4. Centos6的yum源

    更换原因: yum -y install fping 1.阿里云Linux安装软件镜像源 常用的源: 阿里云是最近新出的一个镜像源.得益与阿里云的高速发展,这么大的需求,肯定会推出自己的镜像源.阿里云 ...

  5. CodeForces 553E Kyoya and Train 动态规划 多项式 FFT 分治

    原文链接http://www.cnblogs.com/zhouzhendong/p/8847145.html 题目传送门 - CodeForces 553E 题意 一个有$n$个节点$m$条边的有向图 ...

  6. Pop Star 1.2.5

    原文链接https://www.cnblogs.com/zhouzhendong/p/Pop-Star.html 是VB写的. 年代久远,代码太丑,原码不公开. 下载链接 仅支持Windows,需要解 ...

  7. Ubuntu16.04 14.04安装配置Caffe(GPU版)

    caffe配置过程很长啊,坑非常多,没有linux基础的估计会香菇的.我参考了网上很多的帖子,基本上每个帖子都有或多或少的问题,研究很久最终配置成功.参考过的帖子太多,都记不太清来源了.为了对前人的感 ...

  8. UIdynamic系列认知

    1.刚上来就遇到的大坑 按照前辈们的代码码上了一段重力效果,结果不管怎么折腾都没有任何效果,不由心塞. 开始怀疑是不是模拟器不支持呀?是不是必须拖动到视图上的空间才可以呀? 结果试了各种方法还是没效果 ...

  9. Resource Allocation of Yarn

    关键词:yarn 资源分配 mapreduce spark 简要指南 适合不想看太多原理细节直接上手用的人. 基本原则: container分配的内存不等于机器实际用掉的内存.NM给container ...

  10. Docker ElK安装部署使用教程

    一.简介 1.核心组成 ELK由Elasticsearch.Logstash和Kibana三部分组件组成: Elasticsearch是个开源分布式搜索引擎,它的特点有:分布式,零配置,自动发现,索引 ...