zoukankan      html  css  js  c++  java
  • 代理模式

    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();
        }
    }
  • 相关阅读:
    三大主流负载均衡软件对比(LVS+Nginx+HAproxy)
    nginx 提示the "ssl" directive is deprecated, use the "listen ... ssl" directive instead
    centos安装nginx并配置SSL证书
    hadoop创建目录文件失败
    The server time zone value 'EDT' is unrecognized or represents more than one time zone.
    脚本启动SpringBoot(jar)
    centos做免密登录
    数据库远程连接配置
    Bash 快捷键
    TCP三次握手四次断开
  • 原文地址:https://www.cnblogs.com/imzhuo/p/5884172.html
Copyright © 2011-2022 走看看