栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Spring-代理模式

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Spring-代理模式

目录

介绍

1. 静态代理

2.动态代理

2.1 InvocationHandler

2.2 Proxy

2.3 实现

结语


介绍

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

什么是代理模式?

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

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

(1)检查车祸现场

(2)交罚款

(3)维修汽车

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

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

代理模式分为两种:

静态代理

动态代理

1. 静态代理

代码实现:

事故的接口:

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();
}

输出:

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

静态代理的好处:

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

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

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

缺点 :

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

2.动态代理

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

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

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

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

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

我们需要来了解两个核心类:InvocationHandler 和 Proxy

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的底层机制就是动态代理。
 

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/644321.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号