JDK动态代理主要涉及到java.lang.reflect包中的两个类:Proxy和InvocationHandler。其中InvocationHandler动态创建一个符合某一接口的实例,生成目标类的代理对象。

首先写一个接口 ForumService.java 及其实现类 ForumServiceImpl.java ,主要包括二个方法,删除主题removeTopic 和 删除 removeForum。代码如下:

public class ForumServiceImpl implements ForumService {@SuppressWarnings("static-access")public void removeForum(int forumId) {System.out.println("模拟删除Forum记录:" + forumId);try {Thread.currentThread().sleep(20);} catch (InterruptedException e) {e.printStackTrace();}}@SuppressWarnings("static-access")public void removeTopic(int topicId) {System.out.println("模拟删除Topic记录:" + topicId);try {Thread.currentThread().sleep(40);} catch (InterruptedException e) {e.printStackTrace();}}}

现在需要对二个方法的执行效率进行监控,所以创建一个监控方法效率的类 PerformanceMonitor.java 和 一个辅助工具类 MethodPerformance.java。代码如下:

public class MethodPerformance {private long begin;private long end;private String serviceMethod;public MethodPerformance(String serviceMethod){this.serviceMethod = serviceMethod;this.begin = System.currentTimeMillis();}public void printPerformance(){end = System.currentTimeMillis();long elapse = end - begin;System.out.println(serviceMethod + "花费" + elapse + "毫秒");}
}

public class PerformanceMonitor {private static ThreadLocal<MethodPerformance> performanceRecord = new ThreadLocal<MethodPerformance>();public static void begin(String method){System.out.println("begin monitor……");MethodPerformance mp = new MethodPerformance(method);performanceRecord.set(mp);}public static void end(){System.out.println("end monitor……");MethodPerformance mp = performanceRecord.get();mp.printPerformance();}
}

为了将监控方法效率的代码织入到业务方法 removeTopic 和 removeForum中,我们创建代理类 PerformanceHandler.java,代码如下:

public class PerformanceHandler implements InvocationHandler {private Object target;public PerformanceHandler(Object target) {this.target = target;}public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {PerformanceMonitor.begin(target.getClass().getName() + "." + method.getName());Object obj = method.invoke(target, args);PerformanceMonitor.end();return obj;}
}

首先,我们实现InvocationHandler接口,该接口定义了一个invoke(Object proxy,Method method,Object[] args)方法,proxy是最终生成的代理实例,一般不会用到;method是被代理目标实例的某个具体方法,通过它可以发起目标实例方法的反射调用;args是通过被代理实例某一个方法的入参,在方法 反射调用时使用。

此外,我们再构造函数里通过target传入希望被代理的目标对象,在InvocationHandler()接口方法invoke(Object proxy,Method method,Object[] args)里,将目标实例传给method.invoke()方法,调用目标实例的方法。

下面,我们通过Proxy结合PerformanceHandler创建ForumService接口的代理实例,这个代理实例实现了目标业务类的所有接口,即ForumServiceImpl的ForumService接口。这样我们就可以按照调用ForumService接口实例相同的方式调用代理实例。代码如下:

public class TestForumService {public static void main(String[] args) {ForumService target = new ForumServiceImpl();PerformanceHandler handler = new PerformanceHandler(target);ForumService proxy = (ForumService) Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), handler);proxy.removeForum(1001);proxy.removeForum(100);}
}

执行结果如下:

begin monitor……
模拟删除Forum记录:1001
end monitor……
com.aop.ForumServiceImpl.removeForum花费16毫秒
begin monitor……
模拟删除Forum记录:100
end monitor……
com.aop.ForumServiceImpl.removeForum花费15毫秒

转载于:https://www.cnblogs.com/fangqi/archive/2012/12/10/2810902.html

Spring AOP基础—JDK动态代理相关推荐

  1. AOP、ASPECT、Spring AOP、JDK动态代理、CGLib动态代理

    AOP.ASPECT.Spring AOP.JDK动态代理.CGLib动态代理 1 AOP介绍 1.1 基本定义 AOP(Aspect Oriented Programming)称为面向切面编程,它是 ...

  2. Spring AOP源码分析(四)Spring AOP的JDK动态代理

    2019独角兽企业重金招聘Python工程师标准>>> 本篇文章将会介绍上一个例子中的源码执行情况,从中熟悉整个SpringAOP的一些概念和接口设计. 首先整个SpringAOP的 ...

  3. Spring Boot实践——Spring AOP实现之动态代理

    Spring AOP 介绍 AOP的介绍可以查看 Spring Boot实践--AOP实现 与AspectJ的静态代理不同,Spring AOP使用的动态代理,所谓的动态代理就是说AOP框架不会去修改 ...

  4. Spring AOP 概念及动态代理模式

    Spring AOP 概念及动态代理模式 文章目录 Spring AOP 概念及动态代理模式 1 AOP 的概念及相关术语 2 AOP 作用 3 AOP 原理概述 3.1 JDK 动态代理(Proxy ...

  5. SpringAop篇 (1) AOP 基础之动态代理的实现

    介绍 Spring AOP 主要通过 动态代理 来实现的,所以我们需要在介绍 AOP 用法之前,先来介绍下动态代理的用法以及本质. 对于动态代理的理解可以借鉴普通代理模式.我们普通的Java代理需要为 ...

  6. 基于Spring AOP的JDK动态代理和CGLIB代理

    一.AOP的概念  在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的 ...

  7. Spring AOP中的动态代理主要有两种方式,JDK动态代理和CGLIB动态代理:

    ① JDK动态代理只提供接口的代理,不支持类的代理,要求被代理类实现接口.JDK动态代理的核心是InvocationHandler接口和Proxy类,在获取代理对象时,使用Proxy类来动态创建目标类 ...

  8. 关于Spring AOP,除了动态代理、CGLIB,你还知道什么?

    来源 | 草捏子 责编 | Carol 封图 | CSDN 付费下载于视觉中国 Spring 作为 Java 中最流行的框架,主要归功于其提供的 IOC 和 AOP 功能.本文将讨论 Spring A ...

  9. Spring——AOP操作 AspectJ动态代理方式

    有几天没有学习spring了,今天继续学习尚硅谷spring aop,讲的挺详细的,推荐去看看. 文章目录 一.准备工作 1.导入AspectJ依赖 2.切入点表达式 二 .配置文件实现 1.创建类( ...

最新文章

  1. Science子刊:植物所杨元合组揭示矿物保护和微生物属性对冻土碳动态的关键调控作用...
  2. qt 拖拽 修改大小
  3. DataStage系列教程 (Pivot_Enterprise 行列转换)
  4. 各种数据库连接jdbc
  5. 0009:err:listview:LISTVIEW_WindowProc unknown msg 108c问题解决
  6. php 通过array_merge()和array+array合并数组的区别和效率比较
  7. docker 远程访问_Docker 与其守护进程
  8. linux服务器上已安装R 用户下载R包,服务器R语言包下载、R包离线安装
  9. java文字水印excel_Aspose for java 给word,excel,ppt增加文字水印
  10. 解决Unity TextMeshPro 不能显示中文问题
  11. TreadLocal理解
  12. Referenced file contains errors (xml文件第一行小红叉错误)
  13. 达梦数据库分区表介绍
  14. xcode反汇编调试iOS模拟器程序
  15. 西门子服务器装系统,wincc 7.0安装操作系统
  16. 如何快速用docker搭建npm私服
  17. mount ntfs分区和配置xmms手记(转)
  18. auto怎么用 思域android_十代思域安卓手机互联步骤是什么
  19. MTK平台射频校准问题
  20. 夺神之权服务器维护,流放之路3月28日夺神之权停服更新介绍

热门文章

  1. 关于json_decode乱码及NULL的解决方法
  2. Mirantis Certification summary
  3. linux飞信机器人的安装fetion
  4. IOS正则表达式的用法简介
  5. IIS中WEB服务器的日志存放到SQL Server 2005中
  6. 【Android】Context
  7. Misc(网络+组成原理)
  8. Java中的Runtime类详解
  9. SpringSecurity的简单使用使用案列说明
  10. php设计模式 -- 工厂模式