Spring学习|使用JavaConfig实现bean配置、代理模式:静态代理模式、动态代理模式(通俗易懂)

news2024/10/6 8:23:32

使用JavaConfig实现bean配置

正常我们在spring容器中注册一个Bean,我们需要去bean.xml中去配置,但是我们也可以用JavaConfig类,来去充当bean.xml的作用

首先,我们创建一个User类,@Component代表他是一个bean,方便让spring容器来扫描,@Value相当于之前在bean.xml中为我们注册的bean的属性来去赋值。

编写一个JavaConfig类来代替之前的bean.xml的作用,@Configuration代表它是一个配置类,@ComponentScan代表spring容器扫描bean的范围,@Import就是相当于把多个配置类合在一起,相当于之前的把多个bean.xml合在一起,@Bean就相当于我们之前在bean.xml中要注册的一个bean,方法名就是我们之前注册时bean的id,返回值的类型就相当于class

编写测试类,先得到context对象,然后再调getBean方法根据bean的id来得到bean,并得到其属性。

代理模式

为什么要学习代理模式?因为这就是SpringAOP的底层! [SpringAOP 和SpringMVC]

代理模式的分类:
静态代理
动态代理

静态代理

角色分析:
抽象角色:一般会使用接口或者抽象类来解决(房东要做的事,租房)
真实角色:被代理的角色(房东)
代理角色:代理真实角色代理真实角色后,我们一般会做一些附属操作(中介,帮房东执行想做的事:租房,附属操作:看房、签合同等)
客户: 访问代理对象的人!(跟中介去谈租房的事情,不经过房东)

理解静态代理的小demo

写抽象角色,也就是房东要做的事:租房,用接口来解决,写一个租房接口

写真实角色:房东,它去实现租房接口,定义租房接口的具体操作。

如果我们不通过中介去租房,直接新建一个房东对象,调用他的租房方法即可

但是,房东不想去带客户看房,写合同这些杂事,所以交给中介(代理角色)去做了

我们创建一个代理类,也实现租房的接口,其中有房东的属性,以及有参构造器,用来方便传房东属性的值,还定义了一个租房方法,实际内部执行的核心就是房东(真实角色的该方法)的租房方法。但是,这个代理类也实现了很多增加的方法,比如房东不愿意做的带客户看房,签租赁合同,收中介费等,把这些方法也一起写在代理类执行租房方法的里面。

编写客户端,房东要租房子了,先new一个房东对象,然后创建一个代理对象,并传入房东信息,客户直接面对中介(代理对象)去租房就可以了,我们会发现,代理对象执行房东的租房操作后,不光租了房,而且把看房,签合同等这些多的事也都干了。这就是代理模式的意义,在不改变真实对象操作的基础上,增强真实对象的方法。

深入理解静态代理的demo

创建一个抽象角色,增删改查的接口

创建一个真实角色(房东),去实现上面的增删改查接口,并写出各个增删改查方法的具体操作。

如果不走代理,在客户端,直接新建一个这个真实对象类,调用相应方法即可。

如果说,我们想在本来功能的基础上,在每个方法里增加一个日志功能,如果不用代理模式,则我们需要在真实对象里的每个对应方法中加上对应的代码,才能实现,非常麻烦。也改变了原有的业务代码。

我们只需要新建一个代理对象类,实现增删改查接口,有一个可注入一个真实角色的属性,然后在其中定义一个日志功能的方法,在自己增删改查方法的基础上,除了调用真实角色的增删改查方法,还在每个上面加上自己的日志方法。(图中有误地方依次应为userService.delete、userService.update、userService.query),这样就没有改变原有真实对象的业务代码,而且在原有代码的基础上增加了日志功能。这就是代理模式的好处。

动态代理

动态代理和静态代理角色一样
动态代理的代理类是动态生成的,不是我们直接写好的!
动态代理分为两大类: 基于接口的动态代理,基于类的动态代理
基于接口---JDK动态代理[我们在这里使用]
基于类: cglib
java字节码实现 : javasist
需要了解两个类: Proxy:代理,InvocationHandler: 调用处理程序

理解动态代理的小demo

创建一个抽象角色,租房接口

创建一个真实角色(房东),来实现租房接口,并定义租房方法的实际操作。

之前静态代理的话,我们是需要创建一个代理对象的,不同的真实对象,我们就需要创建一个不同的代理类,非常麻烦

动态代理的话,我们只需要创建下面这个类,去实现InvocationHandler,有一个被代理的接口属性,有set方法可以注入值,有一个可以生成得到代理类的方法,还有一个处理代理实例并返回结果的方法,这块就相当于之前代理角色,在自己的方法中执行代理的真实对象的方法一样。

如果我们要增强本身真实对象的业务代码,我们只需要在这个动态代理类中加入我们需要增强的方法,例如看房子,收中介费,然后将该方法加入到invoke方法中,method.invoke就相当于之前在代理对象方法中调用真实对象执行真实对象的方法,我们将增强的方法放在它的上面或下面即可。

我们编写客户端,先new一个我们需要租房的真实对象,我们再new一个刚才创建的动态代理类,得到这个对象,此时还有没有代理对象,我们先需要用set方法将真实对象传入其中,再调得到代理对象的方法getProxy()得到代理对象,然后我们客户直接面向代理对象,去执行对应的租房方法即可,可以看到,租房方法在真实对象租房方法的基础上增强了,看房子和收中介费方法。

深入理解动态代理的demo

 创建一个抽象角色,增删改查的接口

 创建一个真实角色(房东),去实现上面的增删改查接口,并写出各个增删改查方法的具体操作。

编写动态代理类

在客户端,new一个我们需要的真实角色,new一个我们刚创建的动态代理类,把这个真实角色通过set方法注入动态代理对象中,然后调用获得代理对象方法,得到代理对象后,通过代理对象执行我们想要的方法。增加也好,删除也好。

我们想在真实对象的方法基础上,增加日志功能。在动态代理类中定义一个日志方法,然后在method.invoke上加上该方法即可。

我们在客户端再通过代理对象执行增加方法,即可看到,我们增加的日志方法已经被增加上。

总结

代理模式好处

可以使真实角色的操作更加纯粹!不用去关注一些公共的业务
公共业务就交给代理角色!实现了业务的分工!
公共业务发生扩展的时候,方便集中管理!

静态代理缺点

一个真实角色就会产生一个代理角色;代码量会翻倍~开发效率会变低

动态代理优点

一个动态代理类代理的是一个接口,一般就是对应的一类业务
一个动态代理类可以代理多个类(多个真实角色),只要是实现了同一个接口即可!

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

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

相关文章

SQL优化--插入数据

插入数据(insert优化) 如果我们需要一次性往数据库表中插入多条记录,可以从以下三个方面进行优化。 insert into tb_test values(1,tom); insert into tb_test values(2,cat); insert into tb_test values(3,jerry); 优化方案一&#xff1…

OJ练习第170题——最大间距(桶算法)

最大间距 力扣链接:164. 最大间距 题目描述 给定一个无序的数组 nums,返回 数组在排序之后,相邻元素之间最大的差值 。如果数组元素个数小于 2,则返回 0 。 您必须编写一个在「线性时间」内运行并使用「线性额外空间」的算法…

软件结构化设计-架构真题(二十七)

(2019年)进程P有8个页面,页号分别为0~7,状态位等于1和0分别表示在内存和不在内部才能。假设系统给P分配4个存储块,如果进程P要访问页面6不在内存,那么应该淘汰号是多少? 答案:页号2 …

docker 方式安装mysql 主从方式keepalived实现高可用

一、环境介绍 二、MySQL安装 在两台服务器上都安装mysql 1、拉取镜像 docker pull mysql:8.0.272、创建挂载目录 mkdir -p /data/mysql/3、运行容器 主节点 docker run \--restartalways \--name master_mysql -p 3306:3306 \-e MYSQL_ROOT_PASSWORD123456 -d \-v /data/m…

glTF和GLB有什么区别?

推荐:使用 NSDT场景编辑器快速搭建3D应用场景 自1960年代末开始以来,3D扫描突飞猛进,彻底改变了我们创建真实世界物体和环境的数字模型的方式。虽然很容易考虑它在建筑、工程和游戏等领域的使用,但实际应用要广泛得多。2023年&…

Fiddler实现android手机抓包

目录 一、fiddler的简介二、安装fiddler三、fiddler设置1.设置HTTPS2.设置允许远程连接3. 重启fillder,使得配置生效4. 查看端口监听 四、android端设置1、首先查看电脑的 IP 地址,确保手机和电脑在同一个局域网内2、设置代理 五、抓包测试 原文链接 一、…

Verilog零基础入门(边看边练与测试仿真)-时序逻辑-笔记(4-6讲)

文章目录 第四讲第五讲第六讲 第四讲 1、计数器 代码: //计数器 timescale 1ns/10ps module counter(clk,res,y); input clk; input res; output[7:0] y;reg[7:0] y; wire[7:0] sum;//1运算的结果(1&#xff0…

平安大视野解读宏观经济:看好中国经济长期潜力,资产配置价值凸显

“资产配置多元化是投资中唯一的免费午餐。” 1990年,哈里马科维茨因为他提出的“资产组合选择理论”获得了诺贝尔经济学奖。 如何看待当前国内外宏观经济,如何通过资产配置提升家庭财富健康度?9月4日,平安银行联合《21世纪经济报…

Revit SDK 介绍:CurtainWallGrid 幕墙网格

前言 这个例子介绍如何创建幕墙,以及如何通过 API 编辑幕墙。 内容 运行效果: 创建幕墙 幕墙在 Revit 体系里面属于墙的一种,因此,它对应的 API 类型仍然为 Wall,只是类型有差异。 // WallGeometry::CreateCurt…

机器学习笔记 - 从数学表示的角度看待监督学习

一、概述 监督学习的目标是根据数据进行预测。比如电子邮件垃圾邮件过滤,需要将电子邮件(数据实例)分类为垃圾邮件或非垃圾邮件。 按照传统计算机科学的方法,需要编写一个精心设计的程序,遵循一些规则来确定电子邮件是否是垃圾邮件。尽管这样的程序可能在一段时间内运行得…

Apache解析漏洞实验

实验目的 了解Apache解析漏洞原理掌握Apache漏洞的利用方法 实验工具 火狐:Mozilla Firefox,中文俗称“火狐”(正式缩写为Fx或fx,非正式缩写为FF),是一个自由及开放源代码网页浏览器,使用Gec…

RPC项目解析(1)

分布式通信框架:让远程方法调用和调用进程内方法一样简单 RPC通信原理 rpc:远程过程调用(远程能够调用其他模块的方法) 在rpc中需要发送时候,对发送的信息进行序列化,在服务端对接收到的信息进行反序列化…

【C++11新特性】function包装器

文章目录 1. function包装器1.1 function包装器介绍1.2 function包装器对类型的统一1.3 function包装器的意义 1. function包装器 1.1 function包装器介绍 function包装器是一种函数包装器,也叫做适配器。它可以对可调用对象进行包装,C中的function本质…

C++【C++学习笔记_Wang】

时间进度C是什么?多态什么是多态?生活中的多态C中的多态 赋值兼容赋值兼容规则实现安全转换 时间进度 Day101 ok Day804 ok Day805 ok C是什么? C大部分包含C语言。 C完全兼容C语言。 C在C语言的基础上添加:封装、继承、多态…

【SpringMVC】JSR 303与interceptor拦截器快速入门

目录 一、JSR303 1、什么是JSR 303? 2、为什么要使用JSR 303? 3、JSR 303常用注解 3.1、常用的JSR 303注解 3.2、Validated与Valid区别 3.2.1、Validated 3.2.2、Valid 3.2.3、区别 4、使用案例 4.1、导入依赖 4.2、配置校验规则 4.3、编写…

vue基础知识九:动态给vue的data添加一个新的属性时会发生什么?怎样解决?

一、直接添加属性的问题 我们从一个例子开始 定义一个p标签&#xff0c;通过v-for指令进行遍历 然后给botton标签绑定点击事件&#xff0c;我们预期点击按钮时&#xff0c;数据新增一个属性&#xff0c;界面也 新增一行 <p v-for"(value,key) in item" :key&q…

QQ 逻辑漏洞可执行文件 漏洞复现

本文由掌控安全学院- wax 投稿 首先拿到QQ的版本&#xff0c;目前可测试版本包括QQ最新版本&#xff0c;TIM最新版本 新创建一个bat文件&#xff08;这个可以随意&#xff0c;上马的也可以&#xff0c;exe也可以&#xff09; &#xff0c;本次测试内容如下首先向你的手机端发一…

一文告诉你什么是 TCP 数据粘包,该如何解决!

粘包问题概述 描述背景 采用TCP协议进行网络数据传送的软件设计中&#xff0c;普遍存在粘包问题。这主要是由于现代操作系统的网络传输机制所产生的。 我们知道&#xff0c;网络通信采用的套接字(socket)技术&#xff0c;其实现实际是由系统内核提供一片连续缓存&#xff08…

如何实现高效客户服务自助?

随着科技的不断发展&#xff0c;越来越多的企业开始意识到提供良好的客户服务对于企业的重要性。而在满足客户需求的同时&#xff0c;高效实现客户服务自助也成为了许多企业关注的焦点。客户服务自助可以帮助企业降低成本、提高效率&#xff0c;同时也能给客户带来更好的体验。…

[每周一更]-(第60期):15种MySQL索引失效场景

背景 工作中都会踩到Mysql数据库不走索引的坑。常见的现象就是&#xff1a;明明在字段上添加了索引&#xff0c;但却并未生效。 另外&#xff0c;无论是面试或是日常&#xff0c;Mysql索引失效的通常情况都应该了解和学习。 为了方便学习和记忆&#xff0c;这篇文件将常见的15种…