- 浏览: 139319 次
- 性别:
- 来自: 南京
文章分类
- 全部博客 (129)
- framework (18)
- Java (25)
- web2.0 (7)
- Oracle (23)
- 框架师 (20)
- design pattern (5)
- j2ee (6)
- 日常问题收集 (51)
- linux (12)
- Oralce优化 (4)
- life (3)
- sqlplus (1)
- sql (2)
- C# (4)
- mysql (9)
- 拿来主义 (12)
- 标签 (0)
- ThinkPHP (1)
- python (1)
- mybatis (2)
- html5 (1)
- jquery (2)
- hadoop (3)
- git (1)
- struts2 (1)
- shiro (1)
- struts (1)
最新评论
-
xiao88xian:
...
jQuery常用经典技巧
原文http://blog.zdnet.com.cn/html/90/289390-838716.htmlJDK动态代理
1 package com.baobaotao.proxy; 在JDK 1.3以后提供了动态代理的技术,允许开发者在运行期创建接口的代理实例。在Sun刚推出动态代理时,还很难想象它有多大的实际用途,现在我们终于发现动态代理是实现AOP的绝好底层技术。
JDK的动态代理主要涉及到java.lang.reflect包中的两个类:Proxy和InvocationHandler。其中InvocationHandler是一个接口,可以通过实现该接口定义横切逻辑,在并通过反射机制调用目标类的代码,动态将横切逻辑和业务逻辑编织在一起。
而Proxy为InvocationHandler实现类动态创建一个符合某一接口的代理实例。这样讲一定很抽象,我们马上着手动用Proxy和InvocationHandler这两个魔法戒对上一节中的性能监视代码进行AOP式的改造。
首先,我们从业务类ForumServiceImpl 中删除性能监视的横切代码,使ForumServiceImpl只负责具体的业务逻辑,如所示:
代码清单 5 ForumServiceImpl:移除性能监视横切代码
3 public class ForumServiceImpl implements ForumService {
4
5 public void removeTopic(int topicId) {
6 ①
7 System.out.println("模拟删除Topic记录:"+topicId);
8 try {
9 Thread.currentThread().sleep(20);
10 } catch (Exception e) {
11 throw new RuntimeException(e);
12 }
13 ②
14 }
15 public void removeForum(int forumId) {
16 ①
17 System.out.println("模拟删除Forum记录:"+forumId);
18 try {
19 Thread.currentThread().sleep(40);
20 } catch (Exception e) {
21 throw new RuntimeException(e);
22 }
23 ②
24 }
25 }
从业务类中移除的横切代码当然还得找到一个寄居之所,InvocationHandler就是横切代码的家园乐土,我们将性能监视的代码安置在PerformaceHandler中,如代码清单 6所示:
代码清单 6 PerformaceHandler 1 package com.baobaotao.proxy;
3 import java.lang.reflect.Method;
4
5 public class PerformaceHandler implements InvocationHandler {
6 private Object target;
7 public PerformaceHandler(Object target){//①target为目标的业务类
8 this.target = target;
9 }
10 public Object invoke(Object proxy, Method method, Object[] args)
11 throws Throwable {
12 PerformanceMonitor.begin(target.getClass().getName()+"."+ method.getName());
13 Object bj = method.invoke(target, args);//②通过反射方法调用目标业务类的业务方法
14 PerformanceMonitor.end();
15 return obj;
16 }
17 }
首先,我们实现InvocationHandler接口,该接口定义了一个 invoke(Object proxy, Method method, Object[] args)的方法,proxy是代理实例,一般不会用到;method是代理实例上的方法,通过它可以发起对目标类的反射调用;args是通过代理类传入的方法参数,在反射调用时使用。
此外,我们在构造函数里通过target传入真实的目标对象,如①处所示,在接口方法invoke(Object proxy, Method method, Object[] args)里,将目标类实例传给method.invoke()方法,通过反射调用目标类方法,如②所示。
下面,我们通过Proxy结合PerformaceHandler创建ForumService接口的代理实例,如代码清单 7所示:
代码清单 7 TestForumService:创建代理实例 1 package com.baobaotao.proxy;
3 public class TestForumService {
4 public static void main(String[] args) {
5 ForumService target = new ForumServiceImpl();//①目标业务类
6 //② 将目标业务类和横切代码编织到一起
7 PerformaceHandler handler = new PerformaceHandler(target);
8 //③为编织了目标业务类逻辑和性能监视横切逻辑的handler创建代理类
9 ForumService proxy = (ForumService) Proxy.newProxyInstance(
10 target.getClass().getClassLoader(),
11 target.getClass().getInterfaces(),
12 handler);
13 //④ 操作代理实例
14 proxy.removeForum(10);
15 proxy.removeTopic(1012);
16 }
17 }
按照③处的设置方式,这个代理实例就实现了目标业务类的所有接口,也即ForumServiceImpl的ForumService接口。这样,我们就可以按照调用ForumService接口的实例相同的方式调用代理实例,如④所示。运行以上的代码,输出以下的信息:
begin monitor
end monitor
com.baobaotao.proxy.ForumServiceImpl.removeForum花费47毫秒。
begin monitor
模拟删除Topic记录:1012
end monitor
com.baobaotao.proxy.ForumServiceImpl.removeTopic花费26毫秒。
图 1代理实例的时序图
我们在上图中特别使用虚线阴影的方式对通过代理器创建的ForumService实例进行凸显,该实例内部利用PerformaceHandler整合横切逻辑和业务逻辑。调用者调用代理对象的的removeForum()和removeTopic()方法时,上图的内部调用时序清晰地告诉了我们实际上所发生的一切。
发表评论
-
MyBatis延迟加载
2013-05-26 20:15 806当你要使用one to one,many to one 就 ... -
mybatis 自身关联 映射
2013-05-22 14:48 3212使用mybatis的时候遇到关联问题。 可以参考如下 ... -
ThinkPHP学习笔记
2013-05-11 23:09 799from:http://www.thinkphp.cn/in ... -
解决subclipse报错:svn: Can't open file 'D:\project\Xxx.java.svn-base': 系统找不到指定的文件
2013-03-23 16:49 1922环境为:XP, eclipse, subclipse。 我想 ... -
hibernate4+spring3.1整合常见问题解决方法
2013-03-21 19:21 774由于目前网上很少有关于hibernate4+spring3. ... -
解决maven仓库中找不到ojdbc驱动的问题
2013-02-21 16:51 858maven仓库中的ojdbc下载需要oracle的官方授权, ... -
Ant-Ivy使用
2013-02-21 12:27 1029转至:http://blog.csdn.net/leon70 ... -
ibatis(2)关于配置文件的书写
2012-04-06 13:29 1316最近做了些ibatis 的练习,以及spring对ibatis ... -
spring-ibatis-ext-plugin.1.0.0 扩展ibaits原生SQL(转载)
2012-04-01 16:25 993转载至http://download.csdn.net/ ... -
ibatis初学001
2012-03-31 14:25 1054目录:一、iBatis简介二、iBatis基础操作演示三、如何 ... -
spring2.5+hibernate2.3整合 annotation
2011-12-31 21:48 896晚上花了点时间写了个spring+hibernate的整合 ... -
Hibernate学习总结001-hibernate概述
2011-10-06 21:35 803说到hiberna ... -
struts2_ognl表达式
2011-12-27 09:07 700OGNL是Object Graphic Navigati ... -
文件上传 Struts2 fileupload
2011-12-25 22:17 1462struts2文件上传下载非常的简单。 给我们提供了非 ... -
Action中result的各种转发类型——struts2_003
2012-03-31 14:25 1151<action name="hellow ... -
Action配置中的各项默认值——struts2_002
2011-12-23 12:36 1003<package name="it ... -
Action名称的搜索顺序——struts2_001
2011-12-23 12:33 7351.获得请求路径的URI,例如url是:http://se ...
相关推荐
Spring Aop的底层实现技术 --- Jdk动态代理原理 很不错的一篇文章
我们还提供了实际示例,演示如何在Spring AOP中使用JDK动态代理。 CGLib动态代理: 我们将深入研究CGLib动态代理,它允许您在不需要接口的情况下创建代理对象。您将了解CGLib的工作原理,以及如何生成子类来实现...
6.1.3. Spring的AOP代理 6.2. @AspectJ支持 6.2.1. 启用@AspectJ支持 6.2.2. 声明一个切面 6.2.3. 声明一个切入点(pointcut) 6.2.3.1. 切入点指定者的支持 6.2.3.2. 合并切入点表达式 6.2.3.3. 共享常见的切入点...
7. 重点掌握aop底层的原理之动态代理机制的概述及差别 8. 重点掌握JDK代理技术之产生代理对象和代理对象执行逻辑分析 9. 重点掌握Cglib代理技术之产生代理对象和代理对象执行逻辑分析 10. 认识Spring AOP中底层常用...
8. 掌握cglib和jdk产生代理对象的底层原理 9. 掌握cglib和jdk如何动态添加代理对象的增强功能。 课程目标 1. 可以自主完成阅读Spring框架中BeanDefinition注册流程的源码 2. 可以自主完成阅读Spring框架中Bean实例...
Spring的AOP的底层实现原理; 为什么jdk动态代理是必须是接口 两种动态代理的区别 AOP实现方式:aop注解或者xml配置;后来工具jar包aspects; aop的属性 事务 事务编码方式: 事务注意事项; 为什么同一个类A调用b...
6.1.3. Spring的AOP代理 6.2. @AspectJ支持 6.2.1. 启用@AspectJ支持 6.2.2. 声明一个切面 6.2.3. 声明一个切入点(pointcut) 6.2.4. 声明通知 6.2.5. 引入(Introductions) 6.2.6. 切面实例化模型 6.2.7....
6.1.3. Spring的AOP代理 6.2. @AspectJ支持 6.2.1. 启用@AspectJ支持 6.2.2. 声明一个切面 6.2.3. 声明一个切入点(pointcut) 6.2.4. 声明通知 6.2.5. 引入(Introductions) 6.2.6. 切面实例化模型 6.2.7....
7.5.3. 基于JDK和CGLIB的代理 7.5.4. 对接口进行代理 7.5.5. 对类进行代理 7.5.6. 使用“全局”通知器 7.6. 简化代理定义 7.7. 使用ProxyFactory通过编程创建AOP代理 7.8. 操作被通知对象 7.9. 使用“自动...
7.5.3. 基于JDK和CGLIB的代理 7.5.4. 对接口进行代理 7.5.5. 对类进行代理 7.5.6. 使用“全局”通知器 7.6. 简化代理定义 7.7. 使用ProxyFactory通过编程创建AOP代理 7.8. 操作被通知对象 7.9. 使用“自动...
广泛的被许多AOP的框架使用,例如Spring AOP和dynaop。Hibernate使用CGLIB来代理单端single-ended(多对一和一对一)关联。 四、CGLIB的API 1、Jar包: cglib-nodep-2.2.jar:使用nodep包不需要关联asm的jar包,jar...
6.2.2 JDK动态代理 6.2.3 CGLib动态代理 6.2.4 AOP联盟 6.2.5 代理知识小结 6.3 创建增强类 6.3.1 增强类型 6.3.2 前置增强 6.3.3 后置增强 6.3.4 环绕增强 6.3.5 异常抛出增强 6.3.6 引介增强 6.4 创建切面 6.4.1 ...
6.2.2 JDK动态代理 6.2.3 CGLib动态代理 6.2.4 AOP联盟 6.2.5 代理知识小结 6.3 创建增强类 6.3.1 增强类型 6.3.2 前置增强 6.3.3 后置增强 6.3.4 环绕增强 6.3.5 异常抛出增强 6.3.6 引介增强 6.4 创建切面 6.4.1 ...
包含了摩根面试的技术要点,涉及JVM架构,内存回收,Classloader等JDK底层技术,也包括像HashMap,ConcurrentHashMap,Object线程同步等API的解读,还涉及了Spring AOP原理解析等框架技术。
hashmap的底层原理 hashmap产生死锁的原因 hashmap的容量为什么一定要是2的幂呢 TreeMap的底层原理 HashMap,Hashtable和ConcurrentHashMap的区别 在ArrayList和LinkedList尾部添加元素,谁的效率更高 如果HashMap或者...
Spring的Ioc Spring的AOP , AspectJ Spring的事务管理 , 三大框架的整合 目录 1.1 Spring 框架学习路线:..........................................................................................................
52.说一下 synchronized 底层实现原理? 20 53. synchronized 和 volatile 的区别是什么? 21 54. synchronized 和 Lock 有什么区别? 21 55. synchronized 和 ReentrantLock 区别是什么? 22 56. 说一下 atomic 的...
面试题包括以下十九部分:Java 基础、容器、多线程、反射、对象拷贝、Java Web 模块、异常、网络、设计模式、Spring/Spring MVC、Spring Boot/Spring Cloud、Hibernate、Mybatis、RabbitMQ、Kafka、Zookeeper、MySql...