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
原创粉丝点击