代理模式

代理模式

  

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

  

  静态代理:

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

  

  动态代理:

  动态代理分为两类,一类是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;
    }
}

  

原文地址:https://www.cnblogs.com/Demrystv/p/9420699.html