代理模式

1、静态代理

  1.1静态代理的代理类和和被代理的类都要维护一个共同的接口。

public interface IUserDao {
    void save();
}

  1.2被代理的类,目标对象

public class UserDao implements IUserDao{
    @Override
    public void save() {
        System.out.println("-----已经保存数据!!!------");
    }
}

  1.3代理对象

public class UserDaoProxy implements IUserDao{
    // 接收保存目标对象
    private IUserDao target;
    public UserDaoProxy(IUserDao target) {
        this.target = target;
    }
    @Override
    public void save() {
        System.out.println("开始事务...");
        target.save();             // 执行目标对象的方法
        System.out.println("提交事务...");
    }
}

  1.4测试类

public class App {
    public static void main(String[] args) {
        // 目标对象
        IUserDao target = new UserDao();
        // 代理
        IUserDao proxy = new UserDaoProxy(target);
        proxy.save();  // 执行的是,代理的方法
    }
}

2、动态代理

  2.1同样的,动态代理也需要完成一个接口。(同上)

  2.2目标对象也是相同的。

  2.3只是在代理对象上有所不同

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() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args)
                            throws Throwable {
                        System.out.println("开启事务");
                        // 执行目标对象方法
                        Object returnValue = method.invoke(target, args);    
                        System.out.println("提交事务");
                        return returnValue;
                    }
                });
    }
}

  2.4测试类

public class App {
    public static void main(String[] args) {
        // 目标对象
        IUserDao target = new UserDao();
        System.out.println(target.getClass());
        // 给目标对象,创建代理对象
        IUserDao proxy = (IUserDao) new ProxyFactory(target).getProxyInstance();
        System.out.println(proxy.getClass());
        // 执行方法   【代理对象】
        proxy.save();
    }
}

3、cglib代理

  3.1cglib代理不需要完成接口,只需要写被代理的类和代理类即可,此处被代理类同1.2,所以不再编写。

  3.2代理类有所不同,用到cglib代理模式需要引用spring的核心框架包。

public class ProxyFactory implements MethodInterceptor{
    // 维护目标对象
    private Object target;
    public ProxyFactory(Object target){
        this.target = target;
    }
    // 给目标对象创建代理对象
    public Object getProxyInstance(){
        //1. 工具类
        Enhancer en = new Enhancer();
        //2. 设置父类
        en.setSuperclass(target.getClass());
        //3. 设置回调函数
        en.setCallback(this);
        //4. 创建子类(代理对象)
        return en.create();
    }
    @Override
    public Object intercept(Object obj, Method method, Object[] args,
            MethodProxy proxy) throws Throwable {
        System.out.println("开始事务.....");
        // 执行目标对象的方法
        Object returnValue = method.invoke(target, args);
        System.out.println("提交事务.....");
        return returnValue;
    }
}

  3.3测试类

public class App {
    public static void main(String[] args) {
        // 目标对象
        UserDao target = new UserDao();
        System.out.println(target.getClass());
        // 代理对象
        UserDao proxy = (UserDao) new ProxyFactory(target).getProxyInstance();
        System.out.println(proxy.getClass());
        // 执行代理对象的方法
        proxy.save();
    }
}
原文地址:https://www.cnblogs.com/imzhuo/p/5884172.html