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相关的.在这个系列里,我整理了一些面试题与大家 ...
随机推荐
- 水滴app
在选择了软件工程专业之后,指导教师也让我们参加到了学长学姐的作业之中来,使用学长学姐们的软件并写出自己的使用评价以及自己的一些小评价. 这体验的是第三十二组学长们的软件,他们的队名是自然选择,他们做的 ...
- .Net自动更新程序GeneralUpdate,适用于wpf,winfrom,控制台应用
什么是GeneralUpdate: GeneralUpdate是基于.net framwork4.5.2开发的一款(c/s应用)自动升级程序. 第一个版本叫Autoupdate(原博客: WPF自动更 ...
- 码云git clone报错Incorrect username or password ( access token )
使用码云将仓库clone到本地,报错信息如下: D:\>git clone https://gitee.com/ycyzharry/helloworld.git Cloning into 'he ...
- angular实现地区三级联动
<!DOCTYPE html><html ng-app="myapp"> <head> <meta charset="UTF-8 ...
- windows版redis报错:本地计算机上的Redis服务启动后停止
解决 1.如果需要临时启动Redis 使用命令:redis-server.exe redis.windows.conf --maxheap 200m 说明:200m是指定最大堆内存是200m, ...
- 使用echarts 轻松搞定各种后台数据统计
之前接到老大一个需求,需要将公私生态系统构建一个日志系统,统计公有云.私有云还有其他工具平台(如禅道,jenkins)的用户登录信息,并使用图标的形式动态显示,之前刚入门的时候接触过echarts 这 ...
- Nginx Ingress 高并发实践
概述 Nginx Ingress Controller 基于 Nginx 实现了 Kubernetes Ingress API,Nginx 是公认的高性能网关,但如果不对其进行一些参数调优,就不能充分 ...
- Unity踩过的坑
1.InvokeRepeating调用会在手机后台切换时失效,Coroutine就不会 2.DLL内的函数不支持默认参数,必须传入全部参数 不然会出现如下错误: Unhandled Exception ...
- Lct 动态链接树
通过树链剖分能了解轻重边 Acdreamer 的博客 http://blog.csdn.net/acdreamers/article/details/10591443 然后看杨哲大大的论文,能了解轻重 ...
- JavaScript 时间都去那了(操作时间字符串加减时间)
---给时间充点时间吧--- 时间转换函数: function dateFormat(date, format) { date = new Date(date); var o = { 'M+': da ...