Java代理模式1 - 静态代理、动态代理
来源:互联网 发布:天正制图软件 编辑:程序博客网 时间:2024/05/29 12:32
AOP的拦截功能是由java中的动态代理来实现的。说白了,就是在目标类的基础上增加切面逻辑,生成增强的目标类(该切面逻辑或者在目标类函数执行之前,或者目标类函数执行之后,或者在目标类函数抛出异常时候执行。不同的切入时机对应不同的Interceptor的种类,如BeforeAdviseInterceptor,AfterAdviseInterceptor以及ThrowsAdviseInterceptor等)。
那么动态代理是如何实现将切面逻辑(advise)织入到目标类方法中去的呢?下面我们就来详细介绍并实现AOP中用到的两种动态代理。
AOP的源码中用到了两种动态代理来实现拦截切入功能:jdk动态代理和cglib动态代理。
为了更好的理解动态代理,我们先来看看静态代理:
区别
两种方法同时存在,各有优劣。jdk动态代理是由Java内部的反射机制来实现的,cglib动态代理底层则是借助asm来实现的。总的来说,反射机制在生成类的过程中比较高效,而asm在生成类之后的相关执行过程中比较高效(可以通过将asm生成的类进行缓存,这样解决asm生成类过程低效问题)。还有一点必须注意:jdk动态代理的应用前提,必须是目标类基于统一的接口。如果没有上述前提,jdk动态代理不能应用。由此可以看出,jdk动态代理有一定的局限性,cglib这种第三方类库实现的动态代理应用更加广泛,且在效率上更有优势。
静态代理
1、Count.java
package net.battier.dao; /** * 定义一个账户接口 * * @author Administrator * */ public interface Count { // 查看账户方法 public void queryCount(); // 修改账户方法 public void updateCount(); }
2、CountImpl.java
package net.battier.dao.impl; import net.battier.dao.Count; /** * 委托类(包含业务逻辑) * * @author Administrator * */ public class CountImpl implements Count { @Override public void queryCount() { System.out.println("查看账户方法..."); } @Override public void updateCount() { System.out.println("修改账户方法..."); } }
3、CountProxy.java
package net.battier.dao.impl; import net.battier.dao.Count; /** * 这是一个代理类(增强CountImpl实现类) * * @author Administrator * */ public class CountProxy implements Count { private CountImpl countImpl; /** * 覆盖默认构造器 * * @param countImpl */ public CountProxy(CountImpl countImpl) { this.countImpl = countImpl; } @Override public void queryCount() { System.out.println("事务处理之前"); // 调用委托类的方法; countImpl.queryCount(); System.out.println("事务处理之后"); } @Override public void updateCount() { System.out.println("事务处理之前"); // 调用委托类的方法; countImpl.updateCount(); System.out.println("事务处理之后"); } }
4、TestCount.java
package net.battier.test; import net.battier.dao.impl.CountImpl; import net.battier.dao.impl.CountProxy; /** *测试Count类 * * @author Administrator * */ public class TestCount { public static void main(String[] args) { CountImpl countImpl = new CountImpl(); CountProxy countProxy = new CountProxy(countImpl); countProxy.updateCount(); countProxy.queryCount(); } }
观察代码可以发现每一个代理类只能为一个接口服务,这样一来程序开发中必然会产生过多的代理,而且,所有的代理操作除了调用的方法不一样之外,其他的操作都一样,则此时肯定是重复代码。解决这一问题最好的做法是可以通过一个代理类完成全部的代理功能,那么此时就必须使用动态代理完成。
- Java代理模式 静态代理 动态代理
- Java代理模式1 - 静态代理、动态代理
- Java代理模式 静态代理,动态代理,Cglib代理
- java设计模式-代理模式(静态代理,动态代理)
- java 静态代理与动态代理(代理模式)
- Java中的代理模式----静态代理和动态代理
- java代理设计模式(静态代理与动态代理)
- java代理模式的学习(动态代理+静态代理)
- 代理模式(静态代理+动态代理)——JAVA
- Java代理模式(静态代理、Cglib动态代理)
- java代理模式--静态代理和动态代理
- java代理模式之静态代理与动态代理
- java的代理模式(动态代理和静态代理)
- java 代理模式 静态代理和动态代理
- 代理模式(静态代理和动态代理) JAVA
- 代理模式、静态代理、动态代理、aop
- 代理模式--静态代理VS动态代理
- 代理模式:静态代理与动态代理
- 简单的图中循环删除算法
- Mac 如何配置使用ADB
- 滑动冲突处理
- retrofit合理的处理response
- 【b601】能量项链
- Java代理模式1 - 静态代理、动态代理
- 更新libcurl后yum命令报错
- oracle_事务
- 嵌入式物联网
- 液晶驱动芯片分类
- 判断字符串中的数字是否相同,连续
- JAVA回调机制
- 翻牌记忆游戏
- [干货]让你彻底搞懂Context到底是什么,如果没弄明白,还怎么做Android开发?