Spring AOP系列(二) — 动态代理引言
接上一篇Spring AOP系列(一)— 代理模式,本篇来聊聊动态代理。
动态代理与静态代理的区别
要想了解动态代理与静态代理的区别,需要有两个前置知识点:java程序是如何执行的以及类加载机制。
java程序执行过程

- 将java源码(.java文件)通过编译器(javac.exe)编译成JVM文件(.class文件)。
- 将JVM文件通过java.exe执行,输出结果。
静态代理显示的编写了代理类,因此编译过程中会生成对应的.class文件,最终在运行过程中执行这些.class文件。而动态代理并未显示编写代理类,也并不存在代理类的.class文件,而是在程序运行期间由JVM根据反射等机制动态的生成。
类加载机制
java虚拟机中类加载的全过程,分别是:加载、验证、准备、解析、初始化。其中“加载”是类加载的第一个步骤,在加载阶段,虚拟机需要完成以下3件事情:
- 通过一个类的全限定名来获取定义此类的二进制字节流。
- 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。
- 在内存中生成一个代表这个类的
java.lang.class对象,作为方法区这个类的各种数据访问入口。
由于虚拟机规范对这3点要求并不具体,所以实际的实现是非常灵活的。关于第1点,获取类的二进制字节流(class字节码)就有很多途径:
- 从ZIP包获取,这是JAR、EAR、WAR等格式的基础。
- 从网络中获取,典型的应用是 Applet。
- 运行时计算生成,这种场景使用最多的是动态代理技术,在
java.lang.reflect.Proxy类中,就是用了ProxyGenerator.generateProxyClass来为特定接口生成形式为*$Proxy的代理类的二进制字节流。 - 由其它文件生成,典型应用是JSP,即由JSP文件生成对应的Class类。
- 从数据库中获取等等。
其中“运行时计算生成”,就是“动态代理”技术的实现思路。
小结
静态代理的优点
实现简单,且不侵入原代码。
静态代理的缺点
- 静态代理要求:代理对象与被代理对象需要实现一致的接口,因此当希望使用一个代理类代理多个被代理类时,可以通过以下两种方式:
- 只维护一个代理类,由这个代理类实现多个接口,但是这样就导致代理类过于庞大。
- 新建多个代理类,每个目标对象对应一个代理类,但是这样会产生过多的代理类。
- 当接口需要增加、删除、修改方法的时候,目标对象与代理类都要同时修改,不易维护。
动态代理的优势不在于省去了编写代理类的工作量,而是实现了可以在原始类和接口还未知的时候,就确定代理类的代理行为。当代理类与原始类脱离直接联系后,就可以很灵活地重用于不同的应用场景之中。
接下来将详细地介绍动态代理的两种常见的实现方式:常见的动态代理的实现方式有两种:JDK动态代理和CGLIB动态代理
Spring AOP系列(二) — 动态代理引言的更多相关文章
- Spring AOP系列(三) — 动态代理之JDK动态代理
JDK动态代理 JDK动态代理核心是两个类:InvocationHandler和Proxy 举个栗子 为便于理解,首先看一个例子: 希望实现这样一个功能:使用UserService时,只需关注自己的核 ...
- Spring Boot实践——Spring AOP实现之动态代理
Spring AOP 介绍 AOP的介绍可以查看 Spring Boot实践——AOP实现 与AspectJ的静态代理不同,Spring AOP使用的动态代理,所谓的动态代理就是说AOP框架不会去修改 ...
- Spring AOP中的动态代理
0 前言 1 动态代理 1.1 JDK动态代理 1.2 CGLIB动态代理 1.2.1 CGLIB的代理用法 1.2.2 CGLIB的过滤功能 2 Spring AOP中的动态代理机制 2.1 ...
- 转:Spring AOP中的动态代理
原文链接:Spring AOP中的动态代理 0 前言 1 动态代理 1.1 JDK动态代理 1.2 CGLIB动态代理 1.2.1 CGLIB的代理用法 1.2.2 CGLIB的过滤功能 2 S ...
- spring---aop(4)---Spring AOP的CGLIB动态代理
写在前面 前面介绍了Spring AOP的JDK动态代理的过程,这一篇文章就要介绍下Spring AOP的Cglib代理过程. CGLib全称为Code Generation Library,是一个强 ...
- Spring AOP关于cglib动态代理
一: Spring AOP的默认代理方式是jdk动态代理,还有另外一种代理方式是cglib代理,简单说前者基于接口,后者基于继承,基本思路是将被代理对象的类作为父类,然后创建子类来进行方法的调用,调用 ...
- Spring AOP实现原理-动态代理
目录 代理模式 静态代理 动态代理 代理模式 我们知道,Spring AOP的主要作用就是不通过修改源代码的方式.将非核心功能代码织入来实现对方法的增强.那么Spring AOP的底层如何实现对方法的 ...
- spring---aop(2)---Spring AOP的JDK动态代理
写在前面 spring 事务是springAOP 的一个实现.我们以分析spring的事务,来分析spring的AOP实现. 基本知识 如果目标方法被spring的事务声明,则执行该目标方法的对象就会 ...
- Spring AOP源码分析--代理方式的选择
能坚持别人不能坚持的,才能拥有别人未曾拥有的.关注编程大道公众号,让我们一同坚持心中所想,一起成长!! 年前写了一个面试突击系列的文章,目前只有redis相关的.在这个系列里,我整理了一些面试题与大家 ...
随机推荐
- SpringCloud Alibaba Nacos 服务治理中心
目录 一.什么是Nacos? 二.Nacos能干吗? 三.Nacos关键特性 四.Nacos中的基本概念 五.如何安装部署Nacos? 六.Nacos数据持久化 一.什么是Nacos? 英文全称Dyn ...
- 常被问到的八个 Java 面试题
想要找到一份好的工作,面试是少不了的,可能你觉得自己技术应该不错了,但是面试却是一团糟.下面我收集了八个常常被问到的Java面试题. 1. 阐述 Java 7 和 Java 8 的区别. 实话说, ...
- 09.redis 哨兵主备切换时数据丢失的解决方案
一.两种数据丢失的情况 1. 异步复制导致的数据丢失 因为master->slave的复制是异步的,所以可能有部分数据还没复制到slave,master就宕机了,此时这些部分数据就丢失了 2 ...
- 基于模板特化的Lua自动绑定系统
LuaBind http://www.rasterbar.com/products/luabind.html http://blog.sina.com.cn/s/blog_646817c00100gk ...
- Arbitrary-Oriented Object Detection with Circular Smooth Label(ECCV2020,旋转目标检测)
论文链接:https://arxiv.org/abs/2003.05597 code:https://github.com/Thinklab-SJTU/CSL_RetinaNet_Tensorflow ...
- 为什么一个还没毕业的大学生能够把 IO 讲的这么好?
Java IO 是一个庞大的知识体系,很多人学着学着就会学懵了,包括我在内也是如此,所以本文将会从 Java 的 BIO 开始,一步一步深入学习,引出 JDK1.4 之后出现的 NIO 技术,对比 N ...
- 0 mysql 安装
1 安装网址 https://dev.mysql.com/downloads/installer/ 选择 mysql server版本一路next 2.配置环境 mysql 默认安装位置是: C:\P ...
- el-select 封装
这里打算封装一个全局el-select组件 MySelect.vue <template> <el-select v-if="options.length!==0" ...
- shell中列表的定义与循环
字符串列表定义方法1: a=(f1 f2 f3 f4) for i in ${a[*]}#遍历每一个列表值 for i in ${a[@]}#遍历每一个列表值 实例: #!bin/basha=(f1 ...
- shell小技巧(3)复制文件到其他主机
复制一个文件nfsclient.sh到主机172.18.117.162的/tmp目录下 scp -P22 /tmp/nfsclient.sh root@172.18.117.162:/tmp -P2 ...