动态代理

动态代理

概念

1、动态代理和静态代理角色一样(真实角色、代理角色)
2、动态代理的代理类是动态生成的,不是和静态代理一样定义好代理类
3、动态代理分为两大类,基于接口的动态代理,、基于类的动态代理
	基于接口--->JDK动态代理
	基于类----->cglib
	java字节码实现-->javasist

动态代理的好处

  1. 可以使真实角色操作更加纯粹,不用关注一些公共的业务
  2. 公共部分全部交由代理处理,实现业务分工
  3. 公共业务发生扩展时,方便集中管理
  4. 一个动态代理类代理的是一个接口,一般对应一类业务
  5. 一个动态代理可以代理多个类,只要实现的是同一个接口就行(相当于第四点)

基于JDK实现动态代理

需要了解的类

Proxy:代理

InvocationHandler:调用处理程序

代码实操简单例子

以下为动态代理操作真实对象之前之后添加日志的简单案例

动态代理实现类

package com.lwp.study.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * 自定义动态代理类,实现JDK的InvocationHandler处理器
 */
public class MyProxyHandler implements InvocationHandler {

    /**
     * 代理的目标
     */
    private Object target;

    public MyProxyHandler(Object target){
        this.target = target;
    }

    /**
     * 生成得到代理类
     * @return
     */
    public Object getProxy(){
        return Proxy.newProxyInstance(this.getClass().getClassLoader(),
                target.getClass().getInterfaces(),this);
    }

    /**
     * 代理处理方法
     * @param proxy 调用该方法的代理实例
     * @param method 代理的真实对象处理的方法
     * @param args 包含的方法调用传递代理实例的参数值的对象的阵列,或null如果接口方法没有参数。
     *             原始类型的参数包含在适当的原始包装器类的实例中,例如java.lang.Integer或java.lang.Boolean
     * @return
     * @throws Throwable
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //动态代理的本质,就是通过反射实现
        beforeLog(method.getName());  //操作真实对象方法之前添加日志
        Object invoke = method.invoke(target, args);
        afterLog();  //操作真实对象之后添加日志
        return invoke;
    }

    /**
     * 真实对象操作之前添加日志
     * @param methodName
     */
    public void beforeLog(String methodName){
        System.out.println("用户xxx操作了"+methodName+"方法!");
    }

    /**
     * 真实对象操作之后添加日志
     */
    public void afterLog(){
        System.out.println("用户xxx本次操作完成!");
    }
}

接口类

package com.lwp.study.proxy;

public interface TestStudentInterface {
    public void addStudent();

    public void delStudent();

    public void updateStudent();

    public void queryStudent();
}

实现类

package com.lwp.study.proxy;

public class TestStudent implements  TestStudentInterface{

    public void addStudent(){
        System.out.println("新增了学生");
    }

    public void delStudent(){
        System.out.println("新增了学生");
    }

    public void updateStudent(){
        System.out.println("新增了学生");
    }

    public void queryStudent(){
        System.out.println("新增了学生");
    }
}

测试类

package com.lwp.study.proxy;

public class Test {
    public static void main(String[] args) {
        TestStudent stu = new TestStudent();
        //实例化动态代理类,注入代理对象
        MyProxyHandler mph = new MyProxyHandler(stu);
        //生成代理对象
        TestStudentInterface proxyStu =(TestStudentInterface)mph.getProxy();
        proxyStu.addStudent();
    }
}
posted @ 2021-07-24 15:10  幸运刘  阅读(196)  评论(0)    收藏  举报