先说一下代理模式的好处

1.可以使真实角色的操作更加纯粹,不用去关注一些公共的业务
2.公共的交给代理角色,实现了业务的分工
3.公共业务发生扩展的时候,方便集中管理

静态代理模式的缺点

1.一个真实角色就会产生一个代理角色
2.代码量翻倍,开发效率低

动态代理的分类:

1.基于接口的动态代理:JDK动态代理(本文章使用此方式)
2.基于类的动态代理:cglib

动态代理实现的基本条件

需要了解JDK的两个类:

InvocationHandler:调用处理程序

InvocationHandler是通过一个代理实例零调用处理程序实现的接口。
每个代理实例都有一个相关的调用处理程序。当一个方法是在一个代理实例调用,调用的方法进行编码并派遣其调用处理程序的invoke方法。

Proxy:代理类

Proxy创建动态代理类的实例提供了静态方法,也是所有动态代理类的父类的方法创建。

动态代理的实现

我们此用租房这个场景来实现动态代理

1.首先创建租房的接口及房东实现接口的实现类

// 租房
public interface Rent {
void rent();
}
// 房东
public class landlord implements Rent {
@Override
public void rent() {
System.out.println("房东要出租房子");
}
}

2.继承InvocationHandler类,创建一个动态代理处理类

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy; public class ProxyInvocationHandle implements InvocationHandler {
// 被代理的接口
private Rent rent; public void setRent(Rent rent) {
this.rent = rent;
} // 生成代理类
public Object getProxy(){
return Proxy.newProxyInstance(this.getClass().getClassLoader(),rent.getClass().getInterfaces(),this);
}
// 处理代理实例,并返回处理结果
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// 动态代理的本质,就是使用反射机制实现
Object result = method.invoke(rent, args);
return result;
}
}
  • 而getProxy()方法通过Proxy类的静态方法newProxyInstance()来生成真正的代理类
  • newProxyInstance()的第一个参数是获取类的加载器,第二个参数是被代理的接口,第三个参数是InvocationHandler接口,因为本类ProxyInvocationHandle实现了InvocationHandler接口,所以这里用this代替
  • invoke()方法通过反射机制激活被代理接口中的方法,作用是:处理代理实例,并返回处理结果

简单来说就是:原来静态代理,一个真实角色就会需要一个代理类,重复代码多,且不灵活,现在通过JDK的InvocationHandler接口来动态的生成代理类,我们只需写一个动态代理处理类,把需要代理的对象丢进去就可以自动的生成所对应的代理类,也就是newProxyInstance()的作用。生成完代理类,需要invoke()方法来具体的处理被代理对象实例,通过method.invoke()来激活被代理对象中的方法

3.创建实体类调用方法

public class Client {
public static void main(String[] args) {
// 创建真实角色
landlord landlord = new landlord();
// 创建代理类处理程序
ProxyInvocationHandle pih = new ProxyInvocationHandle();
// 通过调用程序处理角色来处理我们的接口对象,我们把真实角色丢进去,让其代理真实角色
pih.setRent(landlord);
// 这里的proxy是调用程序动态生成的代理类
Rent proxy = (Rent) pih.getProxy();
proxy.rent();
}
}

输出结果

总结

动态代理的好处就是:

  • 可以使真实角色的操作更加纯粹,不用去关注一些公共的业务
  • 公共的交给代理角色,实现了业务的分工
  • 公共业务发生扩展的时候,方便集中管理
  • 一个动态代理类代理的是一个接口,一般就是对应的一类业务
  • 一个动态代理类可以代理多个类,只要是实现了同一接口即可

文章引用地址:
《狂神说JAVA之Spring动态代理》
视频连接:https://www.bilibili.com/video/BV1WE411d7Dv?p=19

Spring学习之动态代理的简单实现的更多相关文章

  1. JDK动态代理实现简单AOP--转

    JDK 动态代理是 java 反射的一个重要特性.它在某种方面为 java 提供了动态性的特性,给应用带来了无限的空间.大名鼎鼎的 Hessian . Spring AOP 基于动态代理实现.本文将简 ...

  2. 浅谈Spring中JDK动态代理与CGLIB动态代理

    前言Spring是Java程序员基本不可能绕开的一个框架,它的核心思想是IOC(控制反转)和AOP(面向切面编程).在Spring中这两个核心思想都是基于设计模式实现的,IOC思想的实现基于工厂模式, ...

  3. Java学习之动态代理篇

    Java学习之动态代理篇 0x00 前言 在后面的漏洞研究的学习中,必须要会的几个知识点.反射机制和动态代理机制.至于反射的前面已经讲到过了,这里就不做更多的赘述了. 0x01 动态代理 这里先来讲一 ...

  4. Spring AOP --JDK动态代理方式

    我们知道Spring是通过JDK或者CGLib实现动态代理的,今天我们讨论一下JDK实现动态代理的原理. 一.简述 Spring在解析Bean的定义之后会将Bean的定义生成一个BeanDefinit ...

  5. 设计模式学习——JAVA动态代理原理分析

    一.JDK动态代理执行过程 上一篇我们讲了JDK动态代理的简单使用,今天我们就来研究一下它的原理. 首先我们回忆下上一篇的代码: public class Main { public static v ...

  6. Spring ( 四 )Spring的AOP动态代理、切面编程

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 一.AOP切面编程 1.什么是AOP AOP是面向切面编程.全称:Aspect Oriented Pro ...

  7. Spring AOP 和 动态代理技术

    AOP 是什么东西 首先来说 AOP 并不是 Spring 框架的核心技术之一,AOP 全称 Aspect Orient Programming,即面向切面的编程.其要解决的问题就是在不改变源代码的情 ...

  8. ASM字节码框架学习之动态代理

    ASM字节码操纵框架,可以直接以二进制的形式来来修改已经存在的类或者创建新的类.ASM封装了操作字节码的大部分细节,并提供了非常方便的接口来对字节码进行操作.ASM框架是全功能的,使用ASM字节码框架 ...

  9. Spring的JDK动态代理如何实现的(源码解析)

    前言 上一篇文章中提到了SpringAOP是如何决断使用哪种动态代理方式的,本文接上文讲解SpringAOP的JDK动态代理是如何实现的.SpringAOP的实现其实也是使用了Proxy和Invoca ...

随机推荐

  1. Python进阶之浅谈内置方法

    目录 有序or无序和可变or不可变 数字类型内置方法 整形 浮点型 字符串类型内置方法 有序or无序和可变or不可变 有序:有索引 无序:无索引 可变:变量值变,id不变 不可变:变量值变,id也变 ...

  2. object detection api调参详解(兼SSD算法参数详解)

    一.引言 使用谷歌提供的object detection api图像识别框架,我们可以很方便地重新训练一个预训练模型,用于自己的具体业务.以我所使用的ssd_mobilenet_v1预训练模型为例,训 ...

  3. 问题 C: 最短路径

    问题 C: 最短路径 在洛谷上刷最短路的题然后被老师拉回去做算法笔记上面的题... 拿到这道题,先确定所有路径唯一,然后是无向边,那么对于边权处理,直接赋值为2的k次方就可以了,然后直接跑最短路. 这 ...

  4. Java桌面应用程序打包

    IDEA环境生成Jar 设置配置 File -> Project Structure -> Artifacts -> + -> JAR -> From modules w ...

  5. NanoPi arm架构下的程序 ./ 运行黑屏 Qt环境可运行

    首先之所以QtCreator环境下可直接运行,但是在终端下 ./ 则不能运行(黑屏但是不报错),判断肯定不是程序或者是库的问题.于是猜想是环境问题,即终端环境与QtCreator环境不同. 然后就查看 ...

  6. 文件的f.seek和文件修改方式以及函数的基本使用

    1.文件f.seek的应用 import time with open('access.log', mode='rb') as f: # 1.将指针跳到文件末尾 # f.read() # 错误 f.s ...

  7. CSS(二)- 选择器 - 伪元素和伪类(思维导图)

    伪元素 伪元素可以创建一些文档语言无法创建的虚拟元素.比如:文档语言没有一种机制可以描述元素内容的第一个字母或第一行,但伪元素可以做到(::first-letter.::first-line).同时, ...

  8. web 部署专题(八):Nginx 反向代理中cookie相关问题

    问题3:认证问题 Domino服务器中,通过写了一些接口代码,提供RESTful的服务,来对手机端进行提供服务.但是由于原来的环境,没有SSO,而且不通过认证,没法访问到Domino里面的接口代码. ...

  9. drf源码剖析系列(系列目录)

    drf源码剖析系列(系列目录) 01 drf源码剖析之restful规范 02 drf源码剖析之快速了解drf 03 drf源码剖析之视图 04 drf源码剖析之版本 05 drf源码剖析之认证 06 ...

  10. 数据可视化实例(十四):面积图 (matplotlib,pandas)

    偏差 (Deviation) 面积图 (Area Chart) 通过对轴和线之间的区域进行着色,面积图不仅强调峰和谷,而且还强调高点和低点的持续时间. 高点持续时间越长,线下面积越大. https:/ ...