Spring AOP(3)

news2024/11/23 21:21:55

目录

Spring AOP原理

代理模式

代理模式中的主要角色

静态代理

 动态代理

总结:面试题

什么是AOP?

Spring AOP实现的方式有哪些?

Spring AOP实现原理 

Spring使用的是哪种代理方式?

JDK和CGLIB动态代理的区别?


Spring AOP原理

代理模式

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

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

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

使用代理前:

 

使用代理后:

比如当进行房屋租赁时, 房主会将房屋授权给中介, 由中介来代理看房, 房屋咨询等服务.

代理模式中的主要角色

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

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

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

譬如房屋租赁

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

RealSubject: 房东

Proxy: 中介

UML类图如下:

 

代理模式可以在不修改被代理对象的基础上, 通过扩展代理类, 进行一些功能的附加和增强.

根据代理的创建时期, 代理模式分为静态代理和动态代理

静态代理: 由程序员创建代理类或特定工具自动生成源代码再对其编译, 让程序运行前代理类的 .class 文件就已经存在了.

动态代理: 在程序运行时, 运用反射机制动态创建而成.

静态代理

静态代理: 在程序运行前, 代理类的.class文件就已经存在了. (在出租房子之前, 中介已经做好了相关的工作, 就等租户来租房子了).

以房屋租赁为例编写代码:

1.定义接口(定义房东要做的事情, 也是中介需要做的事情).

public interface HouseSubject {
    void rentHouse();
}

2.实现接口(房东出租房子)

public class RealHouseSubject implements HouseSubject{
    @Override
    public void rentHouse() {
        System.out.println("我是房东, 我出租房⼦");
    }
}

3.代理(中介, 帮房东出租房子)

public class HouseProxy implements HouseSubject{
    //将被代理对象声明为成员变量
    private HouseSubject houseSubject;
    public HouseProxy(HouseSubject houseSubject) {
        this.houseSubject = houseSubject;
    }
    @Override
    public void rentHouse() {
        //开始代理
        System.out.println("我是中介, 开始代理");
        //代理房东出租房⼦
        houseSubject.rentHouse();
        //代理结束
        System.out.println("我是中介, 代理结束");
    }
}

4.使用:

public class StaticMain {
    public static void main(String[] args) {
        HouseSubject subject = new RealHouseSubject();
        //创建代理类
        HouseProxy proxy = new HouseProxy(subject);
        //通过代理类访问⽬标⽅法
        proxy.rentHouse();
    }
}

运行结果:

 

上面代理的实现方式就是静态代理.

从上述程序中可以看出, 虽然静态代理完成了对目标对象的代理, 但是由于代码都写死了, 对目标对象的每个方法的增强都是手动完成, 非常不灵活.

比如当增加业务时(增加房屋出售), 就还是要编写大量代码.

我们修改接口(Subject)和业务实现类(RealSubject)时, 还需要修改代理类(Proxy).

同样地, 如果有新增接口(Subject)和业务实现类(RealSubject), 也需要对每个业务实现类新增代理类(Proxy).

 动态代理

相比于静态代理来说, 动态代理更加灵活.

我们不需要针对每个目标对象都单独创建一个代理对象, 而是把这个创建代理对象的工作推迟到程序运行时由JVM实现. 也就是说动态代理在程序运行时, 更具需要动态创建生成.

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

 Java也对动态代理进行了实现, 并给我们提供了一些API, 常见的实现方式有两种:

1.JDK动态代理.

2.CGLIB动态代理.

 一般代理模式开发人员基本用不着,一般是开发框架的人用的, 所以不过多介绍(看了估计也容易忘), 仅给出代码:

//JDK代理
public class JDKInvocationHandler implements InvocationHandler {
    private RealHouseSubject target;
 
    public JDKInvocationHandler(RealHouseSubject target) {
        this.target = target;
    }
 
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("开始代理");
        Object o = method.invoke(target, args);
        System.out.println("结束代理");
        return o;
    }
}
 
//main方法
        RealHouseSubject subject = new RealHouseSubject();
        Subject proxy= (Subject)Proxy.newProxyInstance(subject.getClass().getClassLoader(),
                new Class[]{Subject.class},new JDKInvocationHandler(subject));
        proxy.rentHouse();

 主要这里注意两个区别:

JDK可以代理接口, 不可以代理类.

CGLIB既可以代理接口也可以代理类.

 

注意Spring和SpringBoot在这里AOP的实现也是有差异的, 代理工厂中有一个参数proxyTargetClass. 默认Spring是false, 默认接口使用jdk代理. SpringBoot从2.x之后设置为true, 默认全部使用CGLib实现代理. 

总结:面试题

什么是AOP?

答: AOP是一种思想, 是对某一类事情的集中处理. Spring框架实现了AOP, 所以称为SpringAOP.

Spring AOP实现的方式有哪些?

1.基于注解@Aspect来实现.

2.基于自己写的@MyAspect自定义注解来实现

3.基于XML配置的方式实现.

4.基于代理实现. 

Spring AOP实现原理 

Spring AOP主要使用到了动态代理的方式: 动态代理是一种在运行时生成代理对象的机制, Spring AOP利用动态代理技术在方法调用时将切面逻辑织入目标对象中, 实现横切关注点的功能. 具体来说, Spring AOP使用JDK动态代理和CGLIB动态代理来实现对目标对象的代理, 以便在方法调用前后执行额外逻辑.

Spring使用的是哪种代理方式?

在Spring中, 代理工厂中的proxyTargetClass 默认为false. 如果实现了接口, 就是用JDK代理. 如果未实现接口只有实现类, 就是用CGLib代理.

从Spring Boot从2.x之后, proxyTargetClass默认为true, 默认使用CGLib代理

JDK和CGLIB动态代理的区别?

JDK动态代理适用于代理实现了接口的对象, 而CGLIB动态代理适用于代理没有实现接口的对象. JDK动态代理利用反射生成代理对象. 而CGLIB动态代理则是通过继承目标对象并重写方法来实现代理. 

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

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

相关文章

网络安全之交换基础

交换属于二层技术。路由器(router)是三层设备,可以基于IP地址转发,但需要路由表来记录。 交换机(switch)是二层设备,网桥(switch)也是二层设备,这两个都是基…

论文解读--------FedMut: Generalized Federated Learning via Stochastic Mutation

动机 Many previous works observed that the well-generalized solutions are located in flat areas rather than sharp areas of the loss landscapes. 通常,由于每个本地模型的任务是相同的,因此每个客户端的损失情况仍然相似。直观上,…

【qt】联合容器和集合容器

联合容器和集合容器 一.QMap1.应用场景2.添加数据3.删除数据4.修改数据5.查找数据6.数据个数7.是否包含8.返回所有的键名 二.QHash1.应用场景: 三.QMultiMap四.QMultiHash五.QSet1.应用场景2.交集3.并集4.差集 总结: 一.QMap 1.应用场景 QMap的底层实现…

【NPM】Nginx Proxy Manager 一键申请 SSL 证书,自动续期,解决阿里云SSL免费证书每3个月失效问题

文章目录 1、NPM 简介2、实战Step 1:环境搭建 也可以看作者安装笔记 Step 2:创建容器 2.1 在系统任意位置创建一个文件夹,此文档以~/nginx-proxy-manager为例。2.2 创建docker-compose.yaml2.3 启动NPM服务 Step 3:配置反向代理3…

Java入门基础学习笔记10——变量

变量的学习路径: 认识变量->为什么要用变量?->变量有啥特点?->变量有啥应用场景? 什么是变量? 变量是用来记住程序要处理的数据的。 变量的定义格式: 数据类型 变量名称 数据; 数…

JavaScript使用 BigInt

在 JavaScript 中,最大的安全整数是 2 的 53 次方减 1,即 Number.MAX_SAFE_INTEGER,其值为 9007199254740991。这是因为 JavaScript 中使用双精度浮点数表示数字,双精度浮点数的符号位占 1 位,指数位占 11 位&#xff…

NB-IoT电表抄表是什么?

1.技术性简述 NB-IoT是一种低功耗广域网络技术性,尤其适用于规模性联接、深层覆盖和低数据传输速率的使用场景,如远程控制电表抄表。相较于传统有线应无线通讯方法,NB-IoT具有更好的穿透性和更广的覆盖面积,即便在地下室或边远地…

纯 CSS 实现标签自动显示超出数量

现代 CSS 强大的令人难以置信。 这次我们来用 CSS 实现这样一个功能:有多个宽度不同的标签水平排列,当外层宽度不足时,会提示超出的数量,演示效果如下 如果让我用 JavaScript来实现估计都有点折腾,毕竟宽度都是动态的…

【vulhub靶场】Apache 中间件漏洞复现

【vulhub靶场】Apache 中间件漏洞复现 一、Apache HTTPD 换行解析漏洞(CVE-2017-15715)1. 漏洞详情2. 影响版本3. 漏洞复现 二、Apache多后缀解析漏洞(apache_parsing_vulnerability)1. 漏洞详情2. 漏洞复现 三、Apache HTTP Serv…

【CCF-CSP】202403-3 化学方程式配平

输入格式: 从标准输入读入数据。 输入的第一行包含一个正整数 n,表示需要判断的化学方程式的个数。 接下来的 n 行,每行描述了一个需要被配平的化学方程式。包含空格分隔的一个正整数和全部涉及物质的化学式。其中,正整数 m 表…

驱动开发-字符设备驱动的注册与注销

1.注册字符设备驱动 #include<fs.h> int register_chrdev(unsigned int major,const char *name,const struct file_operations *fops) 函数功能&#xff1a;注册字符设备驱动 参数&#xff1a;major&#xff1a;主设备号 major>0:静态指定主设备号&#xff0c;不…

创新指南|将会话式AI聊天机器人纳入PLG增长战略

想象一个繁荣的数字城市广场&#xff0c;志同道合的人们在这里分享他们的激情、经验和知识。想象一个将房东与旅行者、顾客与司机、人们与他们喜爱的品牌无缝连接起来的平台。在这个世界里&#xff0c;用户交流促进增长&#xff0c;社区成为推动力。 如果您的应用程序天生不符…

win10无法被远程桌面连接,Win10系统无法被远程桌面连接的原因有哪些

win10无法被远程桌面连接&#xff0c;Win10系统无法被远程桌面连接的原因有哪些&#xff1f; 先&#xff0c;我们需要明确Win10系统无法被远程桌面连接的可能原因。其中&#xff0c;最常见的原因包括&#xff1a;远程桌面功能未启用、网络连接问题、防火墙或安全软件设置不当、…

kubernetes删除命名空间下所有资源

kubernetes强制删除命名空间下所有资源 在 Kubernetes 中&#xff0c;当一个命名空间处于 Terminating 状态但不会完成删除过程时&#xff0c;通常是因为内部资源没有被正确清理。要强制删除这个命名空间及其所有资源&#xff0c;你可以采取以下步骤&#xff1a; 1. 确认命名空…

Rocketmq如何保证消息不丢失和幂等性

生产者 生产者通过RocketMQ提供的事务消息&#xff08;两阶段提交&#xff09;能保证消息的一致性。 第一阶段给Broker发送一个半事务消息&#xff0c;半事务消息是不能消费的消息&#xff0c;broker已经收到生产者发送的消息&#xff0c;但是并未收到生产者的二次确认&#x…

网络编程--tcp三次握手四次挥手

1、三次握手 &#xff08;1&#xff09;三次握手的详述 首先Client端发送连接请求报文&#xff0c;Server段接受连接后回复ACK报文&#xff0c;并为这次连接分配资源。Client端接收到ACK报文后也向Server段发生ACK报文&#xff0c;并分配资源&#xff0c;这样TCP连接就建立了。…

【计算机毕业设计】springboot果蔬种植销售一体化服务平台

伴随着我国社会的发展&#xff0c;人民生活质量日益提高。于是对果蔬种植销售一体化服务管理进行规范而严格是十分有必要的&#xff0c;所以许许多多的 信息管理系统应运而生。此时单靠人力应对这些事务就显得有些力不从心了。所以本论文将设计一套果蔬种植销售一体化服务平台&…

【LLM 论文】Chain-of-Verification:通过验证链来减少 LLM 幻觉

论文&#xff1a;Chain-of-Verification Reduces Hallucination in Large Language Models ⭐⭐⭐ arXiv:2309.11495 论文速读 LLM 由于不可避免地会产生幻觉&#xff0c;现有的研究主要鼓励 LLM 在产生 response 之前生成内部思想的推理链&#xff0c;或者通过 self-critique…

FreeRTOS任务调度器

目录 1、什么是任务调度器 2、FreeRTOS中的任务调度器 2.1 抢占式调度 2.2 时间片调度 2.3 协作式调度 3、任务调度案例分析 3.1 实验需求 3.2 CubeMX配置 3.3 代码实现 3.3.1 uart.c 重定向printf 3.3.2 打开freertos.c并添加代码 3.3.4 代码现象 1、什么是任务调度…

苹果电脑免费第三方软件CleanMyMac X2025电脑版垃圾清理软件神器

Mac电脑用户在长时间使用电脑之后&#xff0c;时常会看到“暂存盘已满”的提示&#xff0c;这无疑会给后续的电脑使用带来烦恼&#xff0c;那么苹果电脑暂存盘已满怎么清理呢&#xff0c;下面将给大家带来一些干货帮你更好地解决这个问题。 CleanMyMac X2024全新版下载如下: h…