Java代理模式之动态代理

动态代理与静态代理相比,代理对象不需要实现接口,动态代理又称JDK代理

JDK的动态代理主要涉及到java.lang.reflect包中的两个类:Proxy和InvocationHandler。其中InvocationHandler是一个接口,可以通过实现该接口定义横切逻辑,并通过反射机制调用目标类的代码,动态将横切逻辑和业务逻辑编织在一起。而Proxy利用InvocationHandler动态创建一个符合某一个接口的实例,生成目标类的代理对象。

通过Proxy.newProxyInstance(Class classLoader , Class[] interfaces ,InvocationHandler h) 获取代理对象
参数1:classLoader目标对象的classLoader
参数2:interfaces 目标对象实现的接口列表
参数3:h InvocationHandler对象 事件处理器

下面通过给保存用户信息的方法加事务来体验下动态代理的运用:

//接口
public interface IUserDao {
    void save();
}
//目标对象
public class UserDaoImpl implements IUserDao{
    @Override
    public void save() {
        System.out.println("保存用户信息进入数据库");
    }
}
//通过代理工厂获取目标类的代理对象
public class ProxyFactory {

    public static <T> T getProxy(final Object target) {
        return (T) Proxy.newProxyInstance(
                Thread.currentThread().getContextClassLoader(),
                target.getClass().getInterfaces(),
                new InvocationHandler() {
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        System.out.println("开始事务");
                        Object obj = method.invoke(target, args); //调用我们真正的对象方法
                        System.out.println("提交事务");
                        return obj;
                    }
                });
    }
}
//测试类
public class Test {
    public static void main(String[] args) {
        IUserDao proxy = ProxyFactory.getProxy(new UserDaoImpl());
        proxy.save();
    }
}

打印结果:

开始事务
保存用户信息进入数据库
提交事务

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

posted @ 2019-03-15 10:51  浅安时光i  阅读(131)  评论(0编辑  收藏  举报