需求描述:

  抽取dao层开启和提交事物交由代理类一并执行

分析:

  假如UserDao接口中有很多方法,例如addUser()、deleteUser()、updateUser()等等,需要频繁的和数据库打交道,必然在每个方法里都会有开启事物,提交事务的操作。如果把开启事物和提交事物写在一个类A中不同方法中,由一个工厂将dao层和A类进行整合,得到一个代理的UserDao的实现对象,它即有原UserDao实现类中的各个方法,又有A类中的事物方法。即可实现切面管理事物。

代码:

UserDao接口:

  1. package com.xx.dao;
  2.  
  3. public interface UserDao {
  4. //增
  5. void addUser();
  6. //删
  7. void deleteUser();
  8. //改
  9. void updateUser();
  10. }

UserDaoImpl实现类:

  1. package com.xx.dao;
  2.  
  3. public class UserDaoImpl implements UserDao{
  4. @Override
  5. public void addUser() {
  6. System.out.println("添加用户");
  7. }
  8. @Override
  9. public void deleteUser() {
  10. System.out.println("删除用户");
  11. }
  12. @Override
  13. public void updateUser() {
  14. System.out.println("更新用户");
  15. }
  16. }

切面类:

  1. package com.xx.dao;
  2.  
  3. public class MyAspect {
  4. public void before(){
  5. System.out.println("开启事物");
  6. }
  7. public void after(){
  8. System.out.println("关闭事物");
  9. }
  10. }

代理工厂类:

  1. package com.xx.dao;
  2. import java.lang.reflect.InvocationHandler;
  3. import java.lang.reflect.Method;
  4. import java.lang.reflect.Proxy;
  5. /**
  6. * 代理工厂(代理UserDao生成特定功能的实现类对象)
  7. * @author phoebe
  8. *
  9. */
  10. public class ProxyFactory {
  11. //被代理类
  12. private static UserDao userDao = new UserDaoImpl();
  13. //切面类
  14. private static MyAspect myAspect = new MyAspect();
  15. /* 获取新的代理类
  16. * loader:类加载器(选当前类的类加载器)
  17. * 方法一:当前类.class.getClassLoader();
  18. * 方法二:对象.getClass.getClassLoader();
  19. * interfaces:代理生成的对象是哪个接口的实现类呢?
  20. * 方法一:new Class[]{接口.class}
  21. * 方法二:对象.getClass().getInterfaces(),此仅能返回当前对象实现类的接口,并不能返回其父接口
  22. * InvocationHandler:使用其调用处理程序的指定值从子类(通常为动态代理类)构建新的 Proxy 实例。
  23. */
  24. public static UserDao createProxyUserService(){
  25. UserDao proxyInstance = (UserDao) Proxy.newProxyInstance(userDao.getClass().getClassLoader(), userDao.getClass().getInterfaces(), new InvocationHandler() {
  26. @Override
  27. public Object invoke(Object proxy, Method method, Object[] args)
  28. throws Throwable {
  29. Object object = null;
  30. //可以通过method.getName()控制是否增强
  31. if(!("updateUser".equals(method.getName()))){
  32. myAspect.before();
  33. object = method.invoke(userDao, args);
  34. myAspect.after();
  35. System.out.println(object+"为什么是null?尚未知晓");
  36. return object;
  37. }
  38. System.out.println(object+"为什么是null?尚未知晓");
  39. return object;
  40. }
  41. });
  42. //返回UserDao的新实例对象
  43. return proxyInstance;
  44. }
  45. }

测试类:

  1. package com.xx.action;
  2. import com.xx.dao.ProxyFactory;
  3. import com.xx.dao.UserDao;
  4. public class TestProxy {
  5. public static void main(String[] args) {
  6. UserDao userService = ProxyFactory.createUserService();
  7. userService.addUser();
  8. userService.deleteUser();
  9. userService.updateUser();
  10. }
  11. }

效果:

  1. 开启事物
  2. -------添加用户-------
  3. 关闭事物
  4. null为什么是null?尚未知晓
  5. 开启事物
  6. -------删除用户-------
  7. 关闭事物
  8. null为什么是null?尚未知晓
  9. null为什么是null?尚未知晓

动态JDK代理方式-实现类增强的更多相关文章

  1. 面向切面编程之手动JDK代理方式

    需求描述: 抽取dao层开启和提交事物交由代理类一并执行 分析: 假如UserDao接口中有很多方法,例如addUser().deleteUser().updateUser()等等,需要频繁的和数据库 ...

  2. Java代理(静态/动态 JDK,cglib)

    Java的代理模式是应用非常广泛的设计模式之一,也叫作委托模式,其目的就是为其他的对象提供一个代理以控制对某个对象的访问和使用,代理类负责为委托类预处理消息,过滤消息并转发消息,以及对消息执行后续处理 ...

  3. 面经手册 · 第13篇《除了JDK、CGLIB,还有3种类代理方式?面试又卡住!》

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 编程学习,先铺宽度还是挖深度? 其实技术宽度与技术深度是相辅相成的,你能了解多少技术 ...

  4. 面向切面编程之cglib代理方式

    思想: 和上一篇面向切面编程之手动JDK代理方式上的需求和开发模式一样.不同的是目标类没有接口,只有实现类,采用的是spring中提供的Enhancer类继承目标类实现的代理方式. 需要导入的jar包 ...

  5. Spring的两种代理方式:JDK动态代理和CGLIB动态代理

    代理模式 代理模式的英文叫做Proxy或Surrogate,中文都可译为”代理“,所谓代理,就是一个人或者一个机构代表另一个人或者另一个机构采取行动.在一些情况下,一个客户不想或者不能够直接引用一个对 ...

  6. Jmh测试JDK,CGLIB,JAVASSIST动态代理方式的性能

    前言 JDK,CGLIB,JAVASSIST是常用的动态代理方式. JDK动态代理仅能对具有接口的类进行代理. CGLIB动态代理方式的目标类可以没有接口. Javassist是一个开源的分析.编辑和 ...

  7. java两种动态代理方式的理解

    要理解动态代理,不妨先来看看一个静态代理的例子. 一.静态代理 以一个电商项目的例子来说明问题,比如我定义了一个订单的接口IOrder,其中有一个方法时delivery,代码如下. package c ...

  8. JDK动态代理和CGLIB字节码增强

    一.JDK动态代理 Java 在 java.lang.reflect 包中有自己的代理支持,该类(Proxy.java)用于动态生成代理类,只需传入目标接口.目标接口的类加载器以及 Invocatio ...

  9. 性能优于JDK代理,CGLib如何实现动态代理

    按照代理的创建时期,代理类可以分为两种. 静态代理:由程序员创建或特定工具自动生成源代码,再对其编译.在程序运行前,代理类的.class文件就已经存在了. 动态代理:在程序运行时,运用反射机制动态创建 ...

随机推荐

  1. 2021顶级的开源 BI(商业智能)软件和报表工具

    在这个信息化时代,每分每秒都产生海量数据.在海量数据中,挖掘出有用的数据,并且能以较人性化.直观的方式展示这些数据,变得尤为重要.本文将介绍5款顶级开源 BI(商务智能)软件和报表工具,用于商业数据的 ...

  2. 【C# 并发编程】开端

    1,异步编程 异步编程就是使用future模式(又称promise)或者回调机制来实现(Non-blocking on waiting). 如果使用回调或事件来实现(容易callback hell), ...

  3. Invoke and BeginInvoke

    原博客地址:http://www.cnblogs.com/worldreason/archive/2008/06/09/1216127.html 写的真的很好! 在Invoke或者BeginInvok ...

  4. 白话OAuth2.0

     一.OAuth是什么 OAuth简写:Open Authorization(开放授权).百度百科上是这么说的:为用户资源提供了一个安全,开放而又简易的标准.解决了密码的反模式问题(第三方应用不需要知 ...

  5. Weblogic 升级更新补丁操作步骤

    转至:https://blog.csdn.net/allway2/article/details/91424413 Weblogic 升级更新补丁操作步骤: 1.上传补丁包2.kill weblogi ...

  6. 使用Xshell连接VMware上的Linux虚拟机

    转至:https://www.cnblogs.com/yenengfeng/p/13684265.html 虚拟机自己安装好,这边直接说步骤.有借鉴这篇文章 https://www.cnblogs.c ...

  7. qt(一)

    一.Qt安装 qt离线安装地址:http://download.qt.io/archive/qt/ 参考教程:https://blog.csdn.net/u013934107/article/deta ...

  8. sklearn中predict_proba的用法例子(转)

    predict_proba返回的是一个n行k列的数组,第i行第j列上的数值是模型预测第i个预测样本的标签为j的概率.所以每一行的和应该等于1. 举个例子 >>> from sklea ...

  9. Django中的Session和cookie

    Session和cookie 参考文献:https://www.cnblogs.com/wupeiqi/articles/5246483.html 1.问题引入 1.1 cookie是什么? 保存在客 ...

  10. JZ-020-包含 min 函数的栈

    包含 min 函数的栈 题目描述 定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1)). 题目链接: 包含 min 函数的栈 代码 import jav ...