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相关的.在这个系列里,我整理了一些面试题与大家 ...
随机推荐
- 区块链入门到实战(33)之Solidity – 数据类型
在用任何语言编写程序时,都需要使用变量来存储各种信息.变量是内存空间的名称,变量有不同类型,例如整型.字符串类型等等.操作系统根据变量的数据类型分配内存. Solidity中,变量类型有以下几大类: ...
- 图解 K8s 核心概念和术语
我第一次接触容器编排调度工具是 Docker 自家的 Docker Swarm,主要解决当时公司内部业务项目部署繁琐的问题,我记得当时项目实现容器化之后,花在项目部署运维的时间大大减少了,当时觉得这玩 ...
- 接口测试 Mock 实战 | 结合 jq 完成批量化的手工 Mock
本文霍格沃兹测试学院学员学习实践笔记. 一.应用背景 因为本章的内容是使用jq工具配合完成,因此在开始部分会先花一定的篇幅介绍jq机器使用,如果读者已经熟悉jq,可以直接跳过这部分. 先来看应用场景, ...
- .NET Core3.1 Dotnetty实战第二章
一.概要 在上一篇文章讲到Dotnetty的基本认识,本文这次会讲解dotnetty非常核心的模块是属于比较硬核的干货了,然后继续往下讲解如何根据自己的需求或者自己的喜好去配置Dotnetty而不是生 ...
- 记录学习docker命令的随笔
docker安装与启动 安装docker yum包更新到最新 sudo yum update 安装需要的软件包 sudo yum install -y yum-utils device-mappe ...
- UniRapidJson
https://github.com/takezoh/UniRapidJson 如何编译安卓 cd ~/UniRapidJson/build/android make 生成的so可以在 /Users/ ...
- 深入了解Kafka【一】概述与基础架构
1.概述 Kafka是一个分布式的.基于发布订阅的消息系统,主要解决应用解耦.异步消息.流量削峰等问题. 2.发布订阅模型 消息生产者将消息发布到Topic中,同时有多个消息消费者订阅该消息,消费者消 ...
- 解决Oracle在win10 64使用plsql 无法显示表
将当前用户切换至所有用户,然后再切换至当前用户,问题解决 图中sql也可查询出当前库中存在的表: select object_name from user_objects where lower(ob ...
- C# 获取当前月的月初和月末
/// <summary> /// 获取当前月的月末日期 /// </summary> /// <returns></returns> public s ...
- Zabbix template for Microsoft SQL Server总结
Zabbix template for Microsoft SQL Server介绍 这里介绍Zabbix下监控Microsoft SQL Server数据库非常好用的一个模板,模板名为&qu ...