Spring AOP底层原理

news2024/10/2 14:38:43

目录

代理模式

静态代理

动态代理

1. JDK动态代理

创建⼀个代理对象并使用

2. CGLIB动态代理

SpringAOP底层原理面试


代理模式

Spring AOP是基于动态代理模式来实现的

代理模式:静态代理模式+动态代理模式

代理模式, 也叫委托模式。

定义:为其他对象提供一种代理以控制对这个对象的访问。 它的作用就是通过提供一个代理类, 让我们在调用目标方法的时候, 不再是直接对目标方法进行调用, 而是通过代理类间接调用。

在某些情况下, 一个对象不适合或者不能直接引用另一个对象, 而代理对象可以在客户端和目标对象之间起到中介的作用。

静态代理

在程序运行前,代理对象就已经对目标对象进行了步骤的预执行代码

代理模式的主要角色

1. Subject: 业务接口类. 可以是抽象类或者接口(不⼀定有)

2. RealSubject: 业务实现类. 具体的业务执行, 也就是被代理对象.

3. Proxy: 代理类. RealSubject的代理.

例如:房屋租赁

Subject :提前定义了房东做的事情, 交给中介代理, 也是中介要做的事情

RealSubject: 房东

Proxy: 中介

上述程序中, 虽然静态代理也完成了对目标对象的代理, 但是由于代码都写死了, 对目标对象的每个方法的增强都是手动完成的,非常不灵活. 所以日常开发几乎看不到静态代理的场景。

动态代理

相比于静态代理来说,动态代理更加灵活。不需要针对每个目标对象都单独创建⼀个代理对象, 而是把这个创建代理对象的工作推迟到程序运行时由JVM来实现。也就是动态代理在程序时, 根据需要动态创建生成、运行。

例如:房屋中介, 不需要提前预测有哪些业务, 而是业务来了再根据情况创建。

 动态代理常见的实现方式:JDK动态代理(JDK提供的)和CGlib动态代理(第三方)

1. JDK动态代理

定义JDK动态代理类,实现 InvocationHandler接口

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class JDKInvocationHandler implements InvocationHandler {
 //⽬标对象即就是被代理对象
 private Object target;
 public JDKInvocationHandler(Object target) {
 this.target = target;
 }
 
 @Override
 public Object invoke(Object proxy, Method method, Object[] args) throws Thro
 // 代理增强内容
 System.out.println("我是中介, 开始代理");
 //通过反射调⽤被代理类的⽅法
 Object retVal = method.invoke(target, args);
 //代理增强内容
 System.out.println("我是中介, 代理结束");
 return retVal;
 }
}

创建⼀个代理对象并使用

public class DynamicMain {
 public static void main(String[] args) {
 HouseSubject target= new RealHouseSubject();
 //创建⼀个代理类:通过被代理类、被代理实现的接⼝、⽅法调⽤处理器来创建
 HouseSubject proxy = (HouseSubject) Proxy.newProxyInstance(
 target.getClass().getClassLoader(),
 new Class[]{HouseSubject.class},
 new JDKInvocationHandler(target)
 );
 proxy.rentHouse();
 }
}

1. InvocationHandler

InvocationHandler 接口是Java动态代理的关键接口之一, 它定义了⼀个单⼀方法invoke() , 用于处理被代理对象的方法调用。

2. Proxy

Proxy 类中使用频率最高的方法是: newProxyInstance() , 这个方法主要用来生成一个代理对象。

2. CGLIB动态代理

JDK 动态代理只能代理实现了接口的类,有些场景下,业务代码是直接实现的,并没有接口定义,为了解决这个问题, 可以使用CGLIB动态代理机制来解决。

CGLIB 通过继承方式实现代理。Spring中的AOP模块中: 如果目标对象实现了接口,则默认采用JDK 动态代理, 否则采用CGLIB 动态代理。

CGlib依赖

<dependency>
 <groupId>cglib</groupId>
 <artifactId>cglib</artifactId>
 <version>3.3.0</version>
</dependency>

两种动态代理:JDK和CGlib的区别

1.CGlib既可以代理类,也可以代理接口。

SpringAOP底层原理面试

1.springAOP是怎样实现的?

spring AOP是基于动态代理实现的

2.动态代理是如何实现的?

spring动态代理有两种方式实现:JDK和CGlib

3.JDK和CGlib都是实现动态代理的方式,spring使用的是哪个?

两者都用

4.什么时候使用JDK,什么时候使用CGlib?

代理接口,可以使用JDK,也可以使用CGLIB

代理类,只能使用CGLIB

源码中通过proxyTargetClass这个设置项来设置的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1505249.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Mysql - is marked as crashed and should be repaired

概述 上周发生了一个Mysql报错的问题&#xff0c;今天有时间整理一下产生的原因和来龙去脉&#xff0c;Mysql的版本是5.5,发生错误的表存储引擎都是MyISAM,产生的报错信息是Table xxxxxx is marked as crashed and should be repaired。 定位问题 产生的后果是Nginx服务没有…

Util工具类功能设计与类设计(http模块一)

目录 类功能 类定义 类实现 编译测试 Split分割字符串测试 ReadFile读取测试 WriteFile写入测试 UrlEncode编码测试 UrlDecode编码测试 StatuDesc状态码信息获取测试 ExtMime后缀名获取文件mime测试 IsDirectory&IsRegular测试 VaildPath请求路径有效性判断测…

基于Springboot的招生宣传管理系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的招生宣传管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构…

基于springboot的医院信息管理系统(程序+代码+文档)

** &#x1f345;点赞收藏关注 → 私信领取本源代码、数据库&#x1f345; 本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目&#xff0c;希望你能有所收获&#xff0c;少走一些弯路。&#x1f345;关注我不迷路&#x1f345;** 一、研究背景…

智慧公厕方案_智慧公厕解决方案_智慧公厕整体解决方案

一、什么是智慧公厕&#xff1f; 在现代城市化进程中&#xff0c;公共厕所是不可或缺的基础设施之一。然而&#xff0c;传统的公厕管理模式已经无法满足市民对高效、便捷厕所服务的需求。为了实现公共厕所的信息化管理&#xff0c;智慧公厕整体解决方案应运而生。智慧公厕具体…

【MySQL】表的增删改查——MySQL基本查询、数据库表的创建、表的读取、表的更新、表的删除

文章目录 MySQL表的增删查改1. Create&#xff08;创建&#xff09;1.1 单行插入1.2 多行插入1.3 替换 2. Retrieve&#xff08;读取&#xff09;2.1 select查看2.2 where条件2.3 结果排序2.4 筛选分页结果 3. Update&#xff08;更新&#xff09;3.1 更新单个数据3.2 更新多个…

边缘计算相关实验01

1 ChatGLM2-6B模型本地部署 部署的轻量级的模型&#xff0c;硬件配置不够&#xff0c;无法跑起来 2 车辆识别 2.1 车牌识别 开源代码 ​​https://gitcode.net/mirrors/we0091234/chinese_license_plate_detection_recognition?utm_sourcecsdn_github_accelerator​​ 识…

STM32基础--使用寄存器点亮流水灯

GPIO 简介 GPIO 是通用输入输出端口的简称&#xff0c;简单来说就是 STM32 可控制的引脚&#xff0c;STM32 芯片的 GPIO 引脚与外部设备连接起来&#xff0c;从而实现与外部通讯、控制以及数据采集的功能。STM32 芯片的 GPIO被分成很多组&#xff0c;每组有 16 个引脚&#xf…

Pulsar 社区周报 | No.2024.03.08 Pulsar-Spark Connector 助力实时计算

关于 Apache Pulsar Apache Pulsar 是 Apache 软件基金会顶级项目&#xff0c;是下一代云原生分布式消息流平台&#xff0c;集消息、存储、轻量化函数式计算为一体&#xff0c;采用计算与存储分离架构设计&#xff0c;支持多租户、持久化存储、多机房跨区域数据复制&#xff0c…

Linux常用操作命令-防火墙常用操作

一、防火墙常用操作 1、查看防火墙的状态&#xff1b; systemctl status firewalld 2、启动防火墙 systemctl start firewalld.service 3、开启某个端口&#xff0c;如8081端口&#xff0c;输入命令 firewall-cmd --zonepublic --add-port8088/tcp --permanent 4、删除某个…

C语言实战——扫雷游戏

目录 1. 扫雷游戏分析和设计2.扫雷游戏的代码实现 1. 扫雷游戏分析和设计 1.1扫雷游戏的功能说明 使用控制台实现经典的扫雷游戏游戏可以通过菜单实现继续玩或者退出游戏扫雷的棋盘是9*9的格子默认随机布置10个雷可以排查雷 如果位置不是雷&#xff0c;就显示周围有几个雷 如果…

动态规划课堂4-----子数组系列

目录 引入&#xff1a; 例题1&#xff1a;最大子数组和 例题2&#xff1a;环形子数组的最大和 例题3&#xff1a;乘积最大子数组 例题4&#xff1a;乘积为正数的最长子数组 总结&#xff1a; 结语&#xff1a; 引入&#xff1a; 在动态规划&#xff08;DP&#xff09;子…

【新书推荐】19.1 DOS程序段前缀PSP

本节内容&#xff1a;介绍DOS程序段前缀及其应用。 ■程序段前缀PSP&#xff1a;DOS系统加载程序时&#xff0c;在程序段前设置一个具有256字节的信息区称为程序段前缀PSP。 ■终止程序的另一途径&#xff1a;利用程序段前缀PSP偏移地址0处的“INT 20H”终止程序。示例代码t19-…

第三百九十二回

文章目录 1. 概念介绍2. 方法与细节2.1 实现方法2.2 具体细节 3. 示例代码4. 内容总结 我们在上一章回中介绍了"如何混合选择多个图片和视频文件"相关的内容&#xff0c;本章回中将介绍如何通过相机获取图片文件.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. …

NoSQL--3.MongoDB配置(Linux版)

目录 2.2 Linux环境下操作 2.2.1 传输MongoDB压缩包到虚拟机&#xff1a; 2.2.2 启动MongoDB服务&#xff1a; 2.2 Linux环境下操作 2.2.1 传输MongoDB压缩包到虚拟机&#xff1a; &#xff08;笔者使用XShell传输&#xff09; 如果不想放在如图的路径&#xff0c;删除操作…

【Python使用】python高级进阶知识md总结第2篇:HTTP 请求报文,HTTP响应报文【附代码文档】

python高级进阶全知识知识笔记总结完整教程&#xff08;附代码资料&#xff09;主要内容讲述&#xff1a;操作系统&#xff0c;虚拟机软件&#xff0c;Ubuntu操作系统&#xff0c;Linux内核及发行版&#xff0c;查看目录命令&#xff0c;切换目录命令&#xff0c;绝对路径和相对…

(001)UV 的使用以及导出

文章目录 UV窗口导出模型的主要事项导出时材质的兼容问题unity贴图导出导出FBX附录 UV窗口 1.uv主要的工作区域&#xff1a; 2.在做 uv 和贴图之前&#xff0c;最好先应用下物体的缩放、旋转。 导出模型的主要事项 1.将原点设置到物体模型的底部&#xff1a; 2.应用修改器的…

【SpringCloud】微服务重点解析

微服务重点解析 1. Spring Cloud 组件有哪些&#xff1f; 2. 服务注册和发现是什么意思&#xff1f;Spring Cloud 如何实现服务注册和发现的&#xff1f; 如果写过微服务项目&#xff0c;可以说做过的哪个微服务项目&#xff0c;使用了哪个注册中心&#xff0c;常见的有 eurek…

跨平台大小端判断与主机节序转网络字节序使用

1.macOS : 默认使用小端 ,高位使用高地址,转换为网络字节序成大端 #include <iostream> #include <arpa/inet.h> int main() {//大小端判断union{short s;char c[sizeof(short)];}un;un.s = 0x0102;printf("低地址:%d,高地址:%d\n",un.c[0],un.c[1]);if …

腾讯云8核16G服务器支持多少人同时访问?性能和价格测评

腾讯云8核16G轻量服务器CPU性能如何&#xff1f;18M带宽支持多少人在线&#xff1f;轻量应用服务器具有100%CPU性能&#xff0c;18M带宽下载速度2304KB/秒&#xff0c;折合2.25M/s&#xff0c;系统盘为270GB SSD盘&#xff0c;月流量3500GB&#xff0c;折合每天116.6GB流量&…