- 浏览: 121000 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
b2901102002:
赞
java 线程池的原理和实现 -
liuweihug:
Ztree教程-采用Jquery Ajax异步加载数据和Ztr ...
ztree 异步加载示例
看了 stamen的学习spring必要的java基础知识,感觉受益匪浅,也把我学到的记录下来,巩固下加深记忆,也便于以后回来看。
动态代理的应用仔细想起来感觉不是很多,我能想到的就是写日志,事物管理,不过这种模式的话在以后的工作中可能会用得到。
java的动态代理有两种机制,一种是jdk的动态代理,另一种就是cglib的动态代理,两者的区别在于jdk动态代理是基于接口实现的,而cglib跳过了接口直接支持类的代理。
先说下我对动态代理的理解吧,用下面一个图 :
(代理调用图)
首先通过我们的对象生成代理对象,并将实现了我们需要的业务逻辑对象的类织入到代理对象中,然后代理对象调用我们类的方法,然后织入的对象拦截到我们的方法,在我们执行的方法前或执行方法后先调用我们已经写好的逻辑,然后通过反射的invoke方法调用被代理对象的方法,从而实现了动态代理调用。打个比方,就像我们买票,我们直接去火车站买看做是直接调用,但是我们想知道我们什么时候去的,还不想在我们自己的逻辑里写,那我们就可以去找代购点,它就相当于我们的代理,我在他这买车票,在买票前或买票后
他帮我们记下我们啥时候买的票,再调用我们买票的方法拿钱给票,这样既不用我们自己去记什么时候买的票,又有人帮我们记下了,就实现了代理切入。
利用动态代理技术的话,去执行方法的对象就一定是代理对象,那么使用的重点就变成了如何去创建代理对象。下面看下两种方式如何去创建自己的代理对象。
一、jdk代理对象的创建:
首先了解下jdk创建代理的方法,如下代码,它需要三个参数,第一个参数是被创建代理类的加载器,第二个是他实现的接口,第三个是实现InvocationHander接口的一个类,我们的操作代码其实就是写到这个类中,然后利用反射去调用被代理类的方法。
public static Object newProxyInstance(ClassLoader loader,
Class<?>[] interfaces,
InvocationHandler h)
看下执行的代码,从stamen的博客中摘取的代码,其中③-1处可以写我们自己的处理代码。
public class PerformanceHandler implements InvocationHandler {//①实现InvocationHandler private Object target; public PerformanceHandler(Object target){ //②target为目标的业务类 this.target = target; } public Object invoke(Object proxy, Method method, Object[] args) ③ throws Throwable { //③-1 Object obj = method.invoke(target, args);// ③-2通过反射方法调用业务类的目标方法 //③-1 return obj; } }
然后是调用的代码,也是摘取的。
public class TestForumService { public static void main(String[] args) { //①希望被代理的目标业务类 ForumService target = new ForumServiceImpl(); //②将目标业务类和横切代码编织到一起 PerformanceHandler handler = new PerformanceHandler(target); //③根据编织了目标业务类逻辑和性能监视横切逻辑的InvocationHandler实例创建代理实例 ForumService proxy = (ForumService) Proxy.newProxyInstance( target.getClass().getClassLoader(), target.getClass().getInterfaces(), handler); //④调用代理实例 proxy.removeForum(10); proxy.removeTopic(1012); } }
二、CGLib方式实现动态代理
CGLib创建代理对象所依靠的是net.sf.cglib.proxy.Enhancer对象,Enhancer的 setSuperclass方法确定要创建代理的类,setCallback方法确定执行代理方法的类,然后调用create()方法去创建并返回CGLib代理对象,setCallback方法中的参数是要继承net.sf.cglib.proxy.Callback接口的并实现intercept方法的类,在这里我们用创建一个类继承MethodInterceptor接口,MethodInterceptor接口是继承Callback接口的,也就是间接地继承了Callback接口。然后在我们用代理类去调用方法是,就可以执行 intercept方法中我们加入的逻辑,看下代码可能会更清晰,仍然摘取。。。。
public class CglibProxy implements MethodInterceptor { private Enhancer enhancer = new Enhancer(); public Object getProxy(Class clazz) { enhancer.setSuperclass(clazz); //① 设置需要创建子类的类 enhancer.setCallback(this); return enhancer.create(); //②通过字节码技术动态创建子类实例 } //③拦截父类所有方法的调用 public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable { //③-1 Object result=proxy.invokeSuper(obj, args); ③-2 //③-1 return result; } }
上面的 ③-1处可以加入我们自己的逻辑。 下面是利用代理执行操作代码,go on 摘取,手懒啊!!!!
package com.baobaotao.proxy; import java.lang.reflect.Proxy; public class TestForumService { public static void main(String[] args) { CglibProxy proxy = new CglibProxy(); ForumServiceImpl forumService = ① (ForumServiceImpl )proxy.getProxy(ForumServiceImpl.class); forumService.removeForum(10); forumService.removeTopic(1023); } }
这样就实现了CGLib的代理方式。在上面的代码中 CGLibProxy中的getProxy是可以提出到main方法中去实现的,具体的执行就像下面这样
package com.baobaotao.proxy; import java.lang.reflect.Proxy; public class TestForumService { public static void main(String[] args) { Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(ForumServiceImpl); enhancer.setCallback(CglibProxy); ForumServiceImpl forumService = (ForumServiceImpl )enhancer.create(); forumService.removeForum(10); forumService.removeTopic(1023); } }
发表评论
-
转载spring注解配置
2013-01-05 15:03 1040全文转载于: 注解--& ... -
ThreadLocal 多线程访问同一变量解决方案
2013-01-04 14:59 1288声明:是参考stamen的文章写的,文章中很多地方也是摘抄于他 ... -
dom4j学习(1) 读取xml
2012-12-14 16:02 1785由于工作中基本 ... -
java map转bean
2012-12-12 16:59 4545今天看博客看到一篇文章,谈的是将hibernate ... -
ztree 异步加载示例
2012-12-11 11:22 29008工作一年了遇到过三种数型结构JS,dtree 、mi ... -
CXF 集成Spring配置webservice
2012-11-29 10:19 5221用WebService很久了,但都是利用axis2去生 ... -
转 --Http get,post,soap协议的区别
2012-11-06 13:10 4786转载至http://www.cnblogs.com/c2303 ... -
js遍历文件夹(IE)
2012-11-15 15:53 4355首先声明,本方法只适用于IE内核的浏览器,因为要用到Activ ... -
hibernate SerializableBlob转byte数组
2012-10-12 15:06 4633SerializableBlob全称org.hib ... -
配置裸Ibatis
2012-10-09 14:12 1184hibernate的裸配置请看:http://liu ... -
配置裸的Hibernate
2012-10-09 11:35 984裸Ibatis配置http://liuzl121 ... -
java解决乱码的另一种方式
2012-09-10 15:12 886看公司代码习得: 前台URL对参数处理:en ... -
ORACLE 一些操作语句
2012-07-20 10:16 846查找表的外键(包括名称,引用表的表名和对应的键名,下面是分成多 ... -
Spring Hibernate C3P0配置
2012-07-19 11:04 0利用上班的闲暇时间继续整理所学知识,很多公司都用的 ... -
Spring定时任务的动态配置
2012-07-18 22:40 12246首先吐槽下,去年11月以实习生的身份来到现在的公司, ... -
Log4j学习
2012-03-20 22:00 1079<context-param> &l ...
相关推荐
Java动态代理实现AOP Java动态代理是实现Aspect Oriented Programming(AOP)的重要手段。在Java中,动态代理可以通过java.lang.reflect InvocationHandler接口和java.lang.reflect.Proxy类来实现。AOP的主要思想...
### Java动态代理实现AOP详解 #### 一、引言 随着软件开发复杂度的提升,传统的面向对象编程(OOP)已经难以满足现代软件工程的需求。为了更好地管理跨切面的关注点,如日志记录、性能监控、安全控制等,面向切面...
总的来说,Java动态代理实现数据源连接池的核心思想是利用`InvocationHandler`来拦截对数据库操作的调用,通过代理对象在每次操作前后进行连接的获取和释放,从而实现连接池的逻辑。这种方式虽然相比现成的连接池库...
### Java动态代理实现数据库连接池 #### 背景与挑战 在开发应用程序时,数据库连接池是一个常用且重要的组成部分。频繁地建立和断开数据库连接不仅效率低下,还可能导致性能瓶颈。为了解决这一问题,引入了数据库...
下面我们将详细探讨如何使用Java动态代理实现委托模式,以及相关的源码和工具应用。 首先,理解委托模式的基本概念。委托模式通常由三部分组成:委托者(Delegate)、被委托者(Subject)和客户端(Client)。委托...
Java 动态代理是Java平台提供的一种强大的工具,它允许我们在运行时动态生成代理类,这些代理类可以实现一组指定的接口,同时还能在方法调用前后添加自定义的行为。这种机制大大简化了面向切面编程(AOP)和事件监听...
### 使用Java动态代理实现一个简单的网络请求拦截器 #### 一、引言 在软件开发过程中,为了增强程序的功能或方便进行调试与监控,我们常常需要在不改变原有业务逻辑的基础上,添加一些额外的行为(如日志记录、...
在本场景中,我们将探讨如何使用Java动态代理结合注解来实现日志拦截,以便在调用方法时记录相关的日志信息。 首先,让我们了解Java动态代理的基本概念。在Java中,动态代理主要由两个类实现:`java.lang.reflect....
Java中的动态代理是通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口实现的。Proxy类用于创建动态代理实例,而InvocationHandler接口则定义了调用处理程序的逻辑,即当代理对象的方法被...
- `设计模式:用Java动态代理实现AOP.docx`可能包含了如何使用Java动态代理来实现设计模式,尤其是代理模式,以达到AOP的效果。 - `Spring AOP入门实例详解.docx`可能涵盖了Spring AOP的基本概念、配置以及如何...
Java提供了两种主要的动态代理实现方式:JDK动态代理和CGLIB动态代理。 **JDK动态代理**: JDK动态代理基于接口实现,也就是说,被代理的对象必须实现至少一个接口。代理机制的核心是`java.lang.reflect.Proxy`类和...
在深入探讨Java动态代理的实现过程之前,我们首先需要理解动态代理的基本概念及其在Java中的应用价值。动态代理,顾名思义,是在运行时动态创建代理对象的一种机制,它无需在编译期就确定代理类的具体实现,而是通过...
在本文中,我们将深入探讨这两个关键组件以及如何使用它们来实现动态代理。 ### 1. Java动态代理的基本概念 动态代理允许我们在运行时创建一个实现了特定接口的新类。这个新类(代理类)可以代理原始类(目标类)...