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

    代理模式

      

      代理类和委托类有相同的接口,一个代理类的的对象与一个委托类的对象关联。代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法来提供特定的服务。代理类就像是明星,委托类就像是经纪人。关于代理模式的原理,不做过多的介绍,网上有很多帖子,本文主要侧重于代码的实现。

      

      静态代理:

      因为代理对象需要与目标对象实现一样的接口,所以会有很多代理类,类太多.同时,一旦接口增加方法,目标对象与代理对象都要维护.

      

      动态代理:

      动态代理分为两类,一类是JDK动态代理,主要针对实现接口的情况,另一类是cglib动态代理,主要是对指定的类生成一个子类

      1. JDK动态代理

      proxy 类:类的静态方法用来生成动态代理的实例

      innovationhandler 接口有一个 invoke 方法,用来集中处理在动态代理类对象的方法调用,通常在该方法中实现对委托类的代理访问,每次生成动态代理对象时都要指定一个对应的调用处理器。

    接口:

    package com.commonCode.DynamicProxy;
    
    /**
     * Created by Demrystv.
     */
    
    /**
     * 接口
     */
    public interface UserService {
    
        public void addUser();
    
        public void updateUser();
    
        public void delUser();
    
    }

    目标类:

    package com.commonCode.DynamicProxy;
    
    /**
     * Created by Demrystv.
     */
    
    /**
     * 目标类
     */
    public class UserServiceImpl implements UserService {
        @Override
        public void addUser() {
            System.out.println("添加用户");
        }
    
        @Override
        public void updateUser() {
            System.out.println("更新用户");
        }
    
        @Override
        public void delUser() {
            System.out.println("删除用户");
        }
    }

    JDK动态代理类:

    package com.commonCode.DynamicProxy;
    
    /**
     * Created by Demrystv.
     */
    
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;
    
    /**
     * 代理类,JDK动态代理,针对实现接口的情况
     * 需要在springContext.xml中增加如下配置:
     * <aop:aspectj-autoproxy proxy-target-class="true"/>
     */
    public class MyBeanFacByJDK {
        public static UserService createUserService(){
    
            //目标类
            final UserService userService = new UserServiceImpl();
            //生成代理类
            UserService proxyService = (UserService) Proxy.newProxyInstance(MyBeanFacByJDK.class.getClassLoader(),
                    UserService.class.getInterfaces(), new InvocationHandler() {
                        @Override
                        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                            System.out.println("执行前");
                            Object obj = method.invoke(userService, args);
                            System.out.println("执行后");
                            System.out.println("===================");
                            return obj;
                        }
                    });
            return proxyService;
        }
    }

      2. cglib动态代理

      CGlib 是针对类来实现代理,他的原理是对指定的目标类生成一个子类,并且覆盖其中方法实现增强,因为采用的是继承,所以不能对 final 修饰的类进行代理, methodinterceptor。

    package com.commonCode.DynamicProxy;
    
    /**
     * Created by Demrystv.
     */
    
    import org.springframework.cglib.proxy.Enhancer;
    import org.springframework.cglib.proxy.MethodInterceptor;
    import org.springframework.cglib.proxy.MethodProxy;
    
    import java.lang.reflect.Method;
    
    /**
     * 代理类,cglib动态代理,针对没有实现接口的情况,对指定的类生成一个子类
     */
    public class MyBeanFacByCglib {
    
        public static UserService createUserService(){
            //目标类
            final UserService userService = new UserServiceImpl();
    
            //生成代理类
            //1.核心类
            Enhancer enhancer = new Enhancer();
            //2.确定父类
            enhancer.setSuperclass(UserService.class);
            //3.设置回调函数
            enhancer.setCallback(new MethodInterceptor() {
                @Override
                public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy)
                        throws Throwable {
                    System.out.println("执行前");
                    Object obj = method.invoke(userService, objects);
                    System.out.println("执行后");
                    System.out.println("==================");
                    return obj;
                }
            });
            //4.创建代理对象
            UserService proxyUserService = (UserService) enhancer.create();
            return proxyUserService;
        }
    }

      

  • 相关阅读:
    递归 正则表达式 杨辉三角
    js 获取浏览器高度和宽度值
    CSS样式大全
    P2501 [HAOI2006]数字序列 (LIS,DP)(未完成)
    Luogu1064 金明的预算方案 (有依赖的背包)
    Luogu2783 有机化学之神偶尔会做作弊 (树链剖分,缩点)
    Luogu5020 货币系统 (完全背包)
    Luogu2798 爆弹虐场 (二分,Kruskal)
    luogu1419 寻找段落 (二分,单调队列)
    Luogu1083 借教室 (线段树)
  • 原文地址:https://www.cnblogs.com/Demrystv/p/9420699.html
Copyright © 2011-2022 走看看