参考:http://wiki.jikexueyuan.com/project/ssh-noob-learning/dynamic-proxy.html(from极客学院)

一、介绍

Spring的动态代理有两种:一是JDK的动态代理;另一个是cglib动态代理(通过修改字节码来实现代理)。

今天主要讨论JDK动态代理的方式。

JDK的代理方式主要就是通过反射跟动态编译来实现的,主要搭配InvocationHandler和Proxy来实现,下面的例子中使用了两层代理(即代理上加了一层代理)。

二、实例

1. 公共接口

  1. package com.tgb.proxy;
  2.  
  3. public interface UserMgr {
  4.  
  5. void addUser();
  6. void delUser();
  7.  
  8. }

2. 实现类

  1. package com.tgb.proxy;
  2.  
  3. public class UserMgrImpl implements UserMgr {
  4.  
  5. @Override
  6. public void addUser() {
  7. System.out.println("添加用户....");
  8. }
  9.  
  10. @Override
  11. public void delUser() {
  12. System.out.println("删除用户.....");
  13. }
  14.  
  15. }

3. TransactionHandler(InvocationHandler的实现)

  1. package com.tgb.proxy;
  2.  
  3. import java.lang.reflect.InvocationHandler;
  4. import java.lang.reflect.Method;
  5.  
  6. public class TransactionHandler implements InvocationHandler {
  7.  
  8. private Object target;
  9.  
  10. public TransactionHandler(Object target){
  11. super();
  12. this.target = target;
  13. }
  14.  
  15. @Override
  16. public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
  17.  
  18. System.out.println("开启事务...");
  19.  
  20. method.invoke(target);
  21.  
  22. System.out.println("提交事务...");
  23.  
  24. return null;
  25. }
  26.  
  27. }

4. TimeHandler(InvocationHandler的实现)

  1. package com.tgb.proxy;
  2.  
  3. import java.lang.reflect.InvocationHandler;
  4. import java.lang.reflect.Method;
  5. import java.util.Calendar;
  6.  
  7. public class TimeHandler implements InvocationHandler {
  8.  
  9. private Object target;
  10.  
  11. public TimeHandler(Object target) {
  12. super();
  13. this.target = target;
  14. }
  15.  
  16. @Override
  17. public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
  18.  
  19. Calendar calendar = Calendar.getInstance();
  20.  
  21. System.out.println("start time:" + calendar.get(Calendar.HOUR_OF_DAY));
  22.  
  23. method.invoke(target);
  24.  
  25. System.out.println("end time:" + calendar.get(Calendar.HOUR_OF_DAY));
  26.  
  27. return null;
  28. }
  29.  
  30. }

5. 测试类

  1. package com.tgb.proxy;
  2.  
  3. import java.lang.reflect.InvocationHandler;
  4. import java.lang.reflect.Proxy;
  5.  
  6. public class Client {
  7.  
  8. public static void main(String[] args) {
  9.  
  10. UserMgr userMgr = new UserMgrImpl();
  11.  
  12. // 1.第一层代理----------通过动态代理,添加事务处理
  13. InvocationHandler handler = new TransactionHandler(userMgr);
  14. UserMgr userMgrProxy = (UserMgr) Proxy.newProxyInstance(userMgr.getClass().getClassLoader(),
  15. userMgr.getClass().getInterfaces(), handler);
  16.  
  17. // 2.第二层代理----------通过动态代理,添加时间处理
  18. InvocationHandler handler2 = new TimeHandler(userMgrProxy);
  19. UserMgr userMgrProxy2 = (UserMgr) Proxy.newProxyInstance(userMgrProxy.getClass().getClassLoader(),
  20. userMgrProxy.getClass().getInterfaces(), handler2);
  21.  
  22. userMgrProxy2.addUser();
  23.  
  24. System.out.println("========================================");
  25.  
  26. userMgrProxy2.delUser();
  27.  
  28. }
  29. }

输出结果:

  1. start time:Tue Aug 09 23:54:54 CST 2016
  2. 开启事务...
  3. 添加用户....
  4. 提交事务...
  5. end time:Tue Aug 09 23:54:54 CST 2016
  6. ========================================
  7. start time:Tue Aug 09 23:54:54 CST 2016
  8. 开启事务...
  9. 删除用户.....
  10. 提交事务...
  11. end time:Tue Aug 09 23:54:54 CST 2016

Spring 容器AOP的实现原理——动态代理的更多相关文章

  1. 菜鸟学SSH(十四)——Spring容器AOP的实现原理——动态代理

    之前写了一篇关于IOC的博客——<Spring容器IOC解析及简单实现>,今天再来聊聊AOP.大家都知道Spring的两大特性是IOC和AOP,换句话说,容器的两大特性就是IOC和AOP. ...

  2. Spring容器AOP的实现原理——动态代理(转)

    文章转自http://blog.csdn.net/liushuijinger/article/details/37829049#comments

  3. 浅析Spring中AOP的实现原理——动态代理

    一.前言   最近在复习Spring的相关内容,刚刚大致研究了一下Spring中,AOP的实现原理.这篇博客就来简单地聊一聊Spring的AOP是如何实现的,并通过一个简单的测试用例来验证一下.废话不 ...

  4. AOP的实现原理——动态代理

    IOC负责将对象动态的 注入到容器,从而达到一种需要谁就注入谁,什么时候需要就什么时候注入的效果,可谓是招之则来,挥之则去.想想都觉得爽,如果现实生活中也有这本事那就爽 歪歪了,至于有多爽,各位自己脑 ...

  5. 七 MyBatis整合Spring,DAO开发(传统DAO&动态代理DAO)

    整合思路: 1.SQLSessionFactory对象应该放到Spring中作为单例存在 2.传统dao开发方式中,应该从Spring容器中获得SqlSession对象 3.Mapper代理行驶中,应 ...

  6. Hibernate学习--hibernate延迟加载原理-动态代理(阿里电面)

    在正式说hibernate延迟加载时,先说说一个比较奇怪的现象吧:hibernate中,在many-to-one时,如果我们设置了延迟加载,会发现我们在eclipse的调试框中查看one对应对象时,它 ...

  7. spring框架中JDK和CGLIB动态代理区别

    转载:https://blog.csdn.net/yhl_jxy/article/details/80635012 前言JDK动态代理实现原理(jdk8):https://blog.csdn.net/ ...

  8. 新秀学习SSH(十四)——Spring集装箱AOP其原理——动态代理

    之前写了一篇文章IOC该博客--<Spring容器IOC解析及简单实现>,今天再来聊聊AOP.大家都知道Spring的两大特性是IOC和AOP. IOC负责将对象动态的注入到容器,从而达到 ...

  9. Spring AOP实现原理-动态代理

    目录 代理模式 静态代理 动态代理 代理模式 我们知道,Spring AOP的主要作用就是不通过修改源代码的方式.将非核心功能代码织入来实现对方法的增强.那么Spring AOP的底层如何实现对方法的 ...

随机推荐

  1. 题解 CF191C 【Fools and Roads】

    树上差分半裸题 常规思路是进行三次DFS,然后常规运算即可 这里提供两次dfs的思路(wyz tql orz) 我们以样例2为例 我们考虑任意一条路径,令其起点为u终点为v,每走一次当前路径则v的访问 ...

  2. 文件上传:CommonsMultipartResolver

    一. 简介 CommonsMultipartResolver是基于Apache的Commons FileUpload来实现文件上传功能的,主要作用是配置文件上传的一些属性. 二. 配置 1)依赖Apa ...

  3. [Clr via C#读书笔记]Cp14字符字符串和文本处理

    Cp14字符字符串和文本处理 字符 System.Char结构,2个字节的Unicode,提供了大量的静态方法:可以直接强制转换成数值: 字符串 使用最频繁的类型:不可变:引用类型,在堆上分配,但是使 ...

  4. linux NULL 的定义

    #undef NULL #if defined(__cplusplus) #define NULL 0 #else #define NULL ((void *)0) #endif

  5. 【第一章】MySQL数据概述

    安装部署 备份恢复主备复制读写分离HA架构分布式数据库压力测试性能优化自动化运维 ==数据的存储方式1. 人工管理阶段2. 文件系统阶段3. 数据库系统管理阶段 ==数据库技术构成1. 数据库系统 D ...

  6. Java程序员自我介绍

    有关Java程序员的面试自我介绍范文(一) 我叫XXX,今年21岁,毕业于XX解放军信息工程大学计算机科学与技术专业,拥有扎实的Core Java基础,良好的编程风格;熟悉JSP+Servlet+Ja ...

  7. 一些容易记混的c++相关知识点

    一些容易记混的c++相关知识. 截图自:<王道程序员面试宝典>

  8. 并查集(Union/Find)模板及详解

    概念: 并查集是一种非常精巧而实用的数据结构,它主要用于处理一些不相交集合的合并问题.一些常见的用途有求连通子图.求最小生成树的Kruskal 算法和求最近公共祖先等. 操作: 并查集的基本操作有两个 ...

  9. NIO初探

    NIO的前世今生 NIO又叫NonBlockingI/O,即非阻塞I/O.以此对应的,有一个更常见的IO(BIO),又叫Blocking I/O,即阻塞IO,两种都为Java的IO实现方案. NIO/ ...

  10. encode 与 decode

    decode 将其它编码的字符串转换成unicode编码,例如:str1.decode("gb2312"),表示将gb2312编码的字符串转换成unicode编码 encode 将 ...