java动态代理
来源:互联网 发布:人工智能创业公司 编辑:程序博客网 时间:2024/05/16 19:12
由于静态代理(很少用到)
1、每一个代理类只能为一个接口服务,这样一来程序开发中必然会产生过多的代理。
2、所有的代理操作除了调用的方法不一样之外,其他的操作都一样,则此时肯定会造成代码重复。
因此动态代理就应运而生
1、JDKProxy:jdk动态代理
2、cglibProxy:cglib动态代理
3、javaassit
实现jdk动态代理的几大步骤和相关代码:
一、接口
package proxy.jdkProxy;public interface PersonDao {public void savePerson();}二、目标类
package proxy.jdkProxy;/* * 目标类:只关心如何实现操作,就像此例中只关心如何进行savePerson的操作 */public class PersonDaoImpl implements PersonDao{@Overridepublic void savePerson() {System.out.println("save person!!!");}}三、拦截器
package proxy.jdkProxy;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import proxy.dao.Transaction;/** * 拦截器 * 1、将目标类和事务引入进来 * 2、完成invoke方法 * 1、开启事务 * 2、执行savePerson操作 * 3、事务提交 * @author 编程只服JAVA * */public class PersonDaoInterceptor implements InvocationHandler{private Object target;private Transaction transaction;//利用构造方法为两个变量进行赋值操作public PersonDaoInterceptor(Object target, Transaction transaction) {this.target = target;this.transaction = transaction;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args)throws Throwable {// 1、开启事务this.transaction.beginTransaction();// 2、进行savePerson操作method.invoke(target, args);//目标对象调用方法// 3、提交事务this.transaction.commitTransaction();return null;}}
四、客户端(进行测试)
package proxy.jdkProxy;import java.lang.reflect.Proxy;import org.junit.Test;import proxy.dao.Transaction;public class PersonDaoTest {@Testpublic void testJDKProxy() {Object target = new PersonDaoImpl();Transaction transaction = new Transaction();/** * 创建一个拦截器 */PersonDaoInterceptor interceptor = new PersonDaoInterceptor(target,transaction);PersonDao personDao = (PersonDao) Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(), interceptor);personDao.savePerson();}}
cglib动态代理则是改掉了jdk动态代理中目标类需要实现接口这一缺点。而前者产生的代理类则是目标类的子类,将代理类强转为目标类即可调用目标类中的方法。
在spring框架中大量使用了这两种动态代理模式完成了aop。
在aop中,如果目标类有接口,则采用jdkproxy,如果没有接口则采用cglib。
同样在struts2的拦截器中也采用了动态代理,来完成对大量常用操作的松耦合的封装,而在struts2中的javaassit.jar包同样提供了生成动态代理对象。
0 0
- Java 代理,动态代理
- [Java] Java 动态代理
- java代理及动态代理
- java代理模式--动态代理
- Java静态代理、动态代理
- Java 代理之 动态代理
- Java 代理与动态代理
- java静态代理,动态代理
- 代理模式&java动态代理
- Java代理与动态代理
- Java静态代理动态代理
- JAVA代理模式--动态代理
- java 代理和动态代理
- JAVA动态代理 代理模式
- Java动态代理--jdk代理
- Java动态代理--cglib代理
- Java 代理与动态代理
- java代理模式-动态代理
- if(rs.next()) 和 while(rs.next())
- 开源支付系统--龙果支付系统介绍
- 【CodeForces 597A Divisibility】
- NSNotificationCenter使用
- CF 17B 水题
- java动态代理
- Java静态内部类
- 仪仗队(欧拉函数与其打表)
- WindowManager操作View示例
- Google Word2vec 学习手札
- 设计模式随笔-观察者模式
- Android--数据存储(数据持久化)
- Google地图开发总结
- AFNetworking 上传文件