【Spring】动态代理

来源:互联网 发布:python爬虫视频教程 编辑:程序博客网 时间:2024/06/06 10:51

动态代理:

         1)代理对象,不需要实现接口;

         2)代理对象的生成,是利用JDKAPI, 动态的在内存中构建代理对象(需要我们指定创建 代理对象/目标对象 实现的接口的类型)

         3)  动态代理, JDK代理, 接口代理;

JDK中生成代理对象的API

|-- Proxy

         staticObject newProxyInstance(

ClassLoader loader,       指定当前目标对象使用类加载器

  Class<?>[] interfaces,     目标对象实现的接口的类型

InvocationHandler h       事件处理器

)  

注意:代理对象不需要实现接口,但是目标对象一定要实现接口;否则不能用动态代理!

下面我们同样以例子来说明:

首先创建一个IUserDao接口,然后创建目标对象UserDao去实现接口

package cn.qblank.b_dynamic;/** * 目标对象:需要实现接口 * @author Administrator * */public class UserDao implements IUserDao{@Overridepublic void save(){System.out.println("保存数据");}}

然后创建代理工厂ProxyFactory

package cn.qblank.b_dynamic;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;/** * 代理工厂 * 不需要实现接口 * @author Administrator * */public class ProxyFactory {//维护一个目标对象private Object target;public ProxyFactory(Object target){this.target = target;}//给目标对象生成代理对象public Object getProxyInstance(){return Proxy.newProxyInstance(//指定当前类对象使用加载器target.getClass().getClassLoader(),//目标对象实现的接口类型target.getClass().getInterfaces(), //事件处理器new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("开启事务");Object returnValue = method.invoke(target, args);System.out.println("提交事务");return returnValue;}});}}
然后我们测试下

package cn.qblank.b_dynamic;public class Test {public static void main(String[] args) {//创建目标对象IUserDao target = new UserDao();//构建代理对象IUserDao proxy = (IUserDao) new ProxyFactory(target).getProxyInstance();proxy.save();}}

运行结果如下:






原创粉丝点击