Spring——代理模式

??????

哈喽!大家好,我是【一心同学】,一位上进心十足的【Java领域博主】!???

✨【一心同学】的写作风格:喜欢用【通俗易懂】的文笔去讲解每一个知识点,而不喜欢用【高大上】的官方陈述。

✨【一心同学】博客的领域是【面向后端技术】的学习,未来会持续更新更多的【后端技术】以及【学习心得】。

✨如果有对【后端技术】感兴趣的【小可爱】,欢迎关注一心同学】???

❤️❤️❤️感谢各位大可爱小可爱!❤️❤️❤️ 


目录

介绍

一、 静态代理

二、动态代理

2.1 InvocationHandler

2.2 Proxy

2.3 实现

结语


介绍

在学习Spring的AOP之前,我们需要先来学习一下代理模式,因为AOP的底层机制就是动态代理。

什么是代理模式?

通俗易懂的讲解方式就是:

小明开车,装上围栏,出车祸了,这时小明需要做的事有:

(1)检查车祸现场

(2)交罚款

(3)维修汽车

但是小明有钱,于是他请来了一位师傅,帮他处理(1)(2)这两件事,而小明只需要交罚款就好了。

这个例子就是代理模式,小明是被代理的角色,师傅是代理角色。

代理模式分为两种

静态代理

动态代理

一、 静态代理

代码实现:

事故的接口:

public interface Accident {
    public void deal();
}

被代理的对象:

public class Person implements Accident{
    public void deal() {
        System.out.println("上交罚款");
    }
}

代理对象:

public class Proxy implements Accident{
    private Person person;
    public Proxy(Person person){
        this.person=person;
    }
    public void deal(){
        check();
        person.deal();
        fixCar();
    }
    public void check(){
        System.out.println("检查车祸现场");
    }
    public void fixCar(){
        System.out.println("维修汽车");
    }
}

测试:

@Test
public void test(){

        Person person=new Person();
        Accident accident=new Proxy(person);
        accident.deal();
        }

输出:

分析:在这个过程中,假如我是交通警察,那我接触到的只有这个师傅,而不需要小明出面解决。

静态代理的好处:

  • 可以使得我们的真实角色更加纯粹 . 不再去关注一些公共的事情 .

  • 公共的业务由代理来完成 . 实现了业务的分工 ,

  • 公共业务发生扩展时变得更加集中和方便 .

缺点 :

  • 类多了 , 多了代理类 , 工作量变大了 . 开发效率降低 .

二、动态代理

解决静态代理的类太多的问题。

  • 动态代理分为两类 : 一类是基于接口动态代理 , 一类是基于类的动态代理

    • 基于接口的动态代理----JDK动态代理

    • 基于类的动态代理--cglib

这里我们只讲基于接口的动态代理,因为实现的思想都差不多,我们只需要去理解动态代理的思想即可。

我们需要来了解两个核心类:InvocationHandlerProxy

2.1 InvocationHandler

作用调用处理程序的接口

方法

Object invoke(Object proxy, 方法 method, Object[] args);


参数解析:

proxy - 调用该方法的代理实例


method -所述方法对应于调用代理实例上的接口方法的实例。方法对象的声明类将是该方法声明的接口,它可以是代理类继承该方法的代理接口的超级接口。


args -包含的方法调用传递代理实例的参数值的对象的阵列,或null如果接口方法没有参数。原始类型的参数包含在适当的原始包装器类的实例中,例如java.lang.Integer或java.lang.Boolean 。


2.2 Proxy


作用提供了创建动态代理和实例的静态方法。


newProxyInstance(ClassLoader loader,类<?>[] interfaces,InvocationHandler h)

参数解析
loader - 类加载器来定义代理类
interfaces - 代理类实现的接口列表
h - 调度方法调用的调用处理函数


那么我们现在就可以开始来玩动态代理了。

跟静态代理不一样的地方就是代理角色了。

2.3 实现



接口:

public interface Accident {
    public void deal();
}

被代理的对象: 

public class Person implements Accident{
    public void deal() {
        System.out.println("上交罚款");
    }
}

代理: 

package com.yixin.dao;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class ProxyInvocationHandler implements InvocationHandler {
    private Person person;
    public void setPerson(Person person){
        this.person=person;
    }
    public Object getProxy(){
        return Proxy.newProxyInstance(this.getClass().getClassLoader(),
                person.getClass().getInterfaces(),this);
    }

    //进行处理事务
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        check();
        Object result = method.invoke(person, args);
        fixCar();
        return result;
    }
    public void check(){
        System.out.println("检查车祸现场");
    }
    public void fixCar(){
        System.out.println("维修汽车");
    }
}

测试: 

@Test
public void test2(){
        Person person=new Person();
        ProxyInvocationHandler pih = new ProxyInvocationHandler();
        pih.setPerson(person);
        Accident accident=(Accident)pih.getProxy();
        accident.deal();
        }


核心一个动态代理 , 一般代理某一类业务 , 一个动态代理可以代理多个类,代理的是接口!

动态代理的好处

静态代理有的它都有,静态代理没有的,它也有!

  • 可以使得我们的真实角色更加纯粹 . 不再去关注一些公共的事情 .

  • 公共的业务由代理来完成 . 实现了业务的分工 ,

  • 公共业务发生扩展时变得更加集中和方便 .

  • 一个动态代理 , 一般代理某一类业务

  • 一个动态代理可以代理多个类,代理的是接口!


结语


以上就是【一心同学】对代理模式中的静态代理和动态代理的讲解了,我们明白了代理模式,接下来就可以开始学习Spring的AOP了,因为AOP的底层机制就是动态代理。


版权声明:本文为Huang_ZX_259原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。