Spring:IOC和AOP
Spring:IOC和AOP
- 一. IOC
- (1) 引入
- (2) 定义
- (3) 作用
- (4) 实现
- (5) DI依赖注入
- 二. AOP
- (1) 概念
- (2) Spring中的AOP
- (3) 入门案例
- 0. 准备:
- 1. 定义通知类和通知方法;
- 2. 在通知类中描述和定义切入点 @pointcut
- 3. 用注释绑定切入点和通知方法
- 4. 通知类:@Component + @Aspect
- 5. SpringConfig:@EnableAspectJAuotoProxy
- (4) AOP的运行流程
- (5) AOP案例:测量业务层接口万次执行效率
IOC(控制反转)和AOP(面向方面编程)作为Spring框架的两个核心,可以很好地实现解耦合。
简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。
一. IOC
(1) 引入
如以前都是在【业务层】实例化【持久层】对象,耦合性强!
当持久层代码变动时,业务层代码也要改变! 所以有了IOC控制反转,即由IOC容器将持久层的对象注入到业务层;
(2) 定义
控制反转即主动变成被动;
IOC控制反转,即 主动new对象
变成由于 外部(IOC容器)去提供对象
,被IOC容器所管理的对象也被称为 bean
;
(3) 作用
解耦合,如果dao层有变化,则不需要改变service层代码!
(4) 实现
Spring技术对IOC思想进行了实现:
Spring提供了Core Container容器,称为IOC容器
,用来充当IOC思想中的外部;
即在Spring中,IOC可以理解为由主动new对象,转换为由IOC容器提供对象;
IOC会管理大量的对象(用到了 反射机制
,根据路径名获取类文件,进而完成对象创建,创建对象调用的是无参构造
);
IOC会管理对象的创建和初始化的过程;
IOC容器负责对象的创建、初始化等一些列工作,被创建或管理的对象在IOC容器中统称为
Bean
;
(5) DI依赖注入
在容器中建立Bean与Bean之间的依赖关系的过程,称为依赖注入!
Spring通过DI(依赖注入)实现IOC(控制反转);
效果:在需要使用Service对象时,里面的dao对象就已经由IOC容器生成并注入了!
目标:充分解耦;
总结:
- IOC :用对象的时候不用程序去new,而是由IOC容器提供;
- DI:当IOC中的Bean有关系时,会绑定依赖;
二. AOP
(1) 概念
AOP可以说是对OOP(面向对象编程) 的补充和完善;
面向对象就是将事物的特性和行为抽象为一个对象,如people类有身高、体重、年龄等属性,也有吃饭、睡觉等行为。把这些特性和行为封装成一个类,然后可以统一调用。
AOP(面向切面编程) 就是把一个单独的业务功能抽取出来,然后动态把这个功能切入到需要的方法(或行为)中;
即将功能先定义好,需要的地方才切入,这样便于减少系统的重复代码,降低模块间的耦合度。
作用:
①降低耦合度
②不改变原有代码的基础下,增加新功能;
Spring AOP就是基于动态代理
实现的,动态代理又利用了反射机制
;
使用场景:
如果有相同的、大量使用的功能在很多地方增强,适合AOP------------即简化共性功能的开发;
(2) Spring中的AOP
Spring理念:无侵入式编程,即不改变原有代码的基础上,为其增加新的功能;(使用了动态代理
)
AOP将业务逻辑组件和切面类都加入到容器中,通过@Aspect通知注解给切面类的目标方法标注在哪运行。
连接点:所有的原始方法;
切入点Pointcut:需要被功能来增强的方法(特殊的连接点);
通知advice:即抽取出来的增强的功能;
切面:绑定通知和切入点的关系,一个通知对应一个切入点;
总结:
抽取程序中要增强的部分作为一个通知方法;
执行对应通知的方法就是切入点;
将通知和切入点绑定的就是切面,切面就是描述在哪个切入点上执行哪些通知;
(3) 入门案例
需求:不改变切入点代码的前提下,执行update()时也打印系统时间; ;
思路分析:
1.导入AOP和Aspect的坐标
2.准备连接点(原始方法)
3.制作共性功能------通知和通知类;
4.定义切入点Pointcut;
5.绑定通知方法和切入点(切面)
0. 准备:
BookDao:
BookDao实现类:
目前只有执行save()方法才会打印系统时间;
导入aop和aspect包;
aop包默认依赖于spring-context,所以只需要导aspectjweaver包;
1. 定义通知类和通知方法;
2. 在通知类中描述和定义切入点 @pointcut
用切入点表达式定义切入点,使用 @Pointcut
;
①在Execution中描述实际的切入点方法(切入点表达式):
②定义一个私有方法pt(空壳),代表切入点;
3. 用注释绑定切入点和通知方法
此处让通知方法在切入点的前面执行,用@Before
,括号中写定义的切入点的私有方法pt();
此处通知方法即打印当前时间;
此处的切入点即update()方法;
4. 通知类:@Component + @Aspect
要能让Spring控制,先用@Componet
将通知类定义为bean,
然后用@Aspect
让通知类中的东西生效,让Spring知道这是AOP;
5. SpringConfig:@EnableAspectJAuotoProxy
告诉Spring:这里用了注解开发的AOP,即去启动了@Aspect,而Aspect告诉Spring去识别通知类;
效果:执行update也会打印系统时间;
(4) AOP的运行流程
1.启动 Spring容器
2.读取 所有【切面配置】中的pointcut
切入点;
3.初始化 bean;
判定 bean对应的类(如BookDaoImpl)中的原始方法
(如update)是否匹配到【通知类中】配置的切入点
※
匹配成功,创建原始对象(即目标对象)的代理对象
;
4.获取bean执行方法;
当匹配成功,获取的bean是代理对象,则用代理对象去调用原始方法与通知方法;
(即用代理对象去调用对应的方法(update),然后走增强的通知方法的操作;)
整个AOP的实现过程是由代理模式来进行的;
总结:如果配置的切入点能和类(BookDaoImpl)的方法匹配上,那么就创建代理对象,用代理对象去调用原始方法和增强的通知方法; 否则就只创建原始对象;
(5) AOP案例:测量业务层接口万次执行效率
AOP案例:测量业务层接口万次执行效率
相关文章:

Spring:IOC和AOP
Spring:IOC和AOP一. IOC(1) 引入(2) 定义(3) 作用(4) 实现(5) DI依赖注入二. AOP(1) 概念(2) Spring中的AOP(3) 入门案例0. 准备:1. 定义通知类和通知方法;2. 在通知类中描述和定义切入点 pointcut3. 用注释绑定切入点和通知方法4. 通知类&am…...

【笔记】效率之门——Python中的函数式编程技巧
文章目录Python函数式编程1. 数据2. 推导式3. 函数式编程3.1. Lambda函数3.2. python内置函数3.3. 高阶函数4. 函数式编程的应用Python函数式编程 我的AI Studio项目:【笔记】LearnDL第三课:Python高级编程——抽象与封装 - 飞桨AI Studio (baidu.com) p…...

Java【多线程基础2】 Thread类 及其常用方法
文章目录前言一、Thread类1, 构造方法2, 常用成员属性3, 常用成员方法3.1, start 启动线程3.2, interrupt 中断线程 (重点)3.2.1, 手动设置标记位3.2.2, 使用内置标记位3.3.3, interrupt 方法 的作用3.3 sleep 休眠线程3.4, jion 等待线程3.5 获取当前线程的引用总结前言 各位读…...
JVM调优实战及常量池详解
目录 阿里巴巴Arthas详解 Arthas使用场景 Arthas使用 GC日志详解 如何分析GC日志 CMS G1...

ChatGPT研究分析:GPT-4做了什么
前脚刚研究了一轮GPT3.5,OpenAI很快就升级了GPT-4,整体表现有进一步提升。追赶一下潮流,研究研究GPT-4干了啥。本文内容全部源于对OpenAI公开的技术报告的解读,通篇以PR效果为主,实际内容不多。主要强调的工作…...

我为什么要写博客,写博客的意义是什么??
曾经何时我也不知道,怎样才能变成我自己所羡慕的大佬!!在一次次的CSDN阅读的过程中,结实了许多志同道合的人!!包过凉哥,擦姐……大佬,但是,很遗憾,与这些人只…...

ssm框架之spring:浅聊AOP
AOP(Aspect Oriented Programming),是一种设计思想。先看一下百度百科的解释: 在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期间动态…...
k8s详解
一、k8s中的yaml文件 JSON格式:主要用于api接口之间信息的传递YAML格式:主要用于配置和管理,YAML是一种简洁的非标记性语言,内容格式人性化 YAML格式: 大小写敏感使用缩进代表层级关系,不支持TAB制表符缩…...
计算机操作系统(第四版)第一章操作系统引论 1.1操作系统的目标和作用
第一章操作系统引论 1.1操作系统的目标和作用 什么是操作系统OS? 配置在计算机硬件上的第一层软件是对硬件的首次扩充。 是最重要的系统软件,其他系统软件应用软件都依赖于操作系统的支持。 操作系统主要作用? 管理计算机系统所有硬件设…...
git push解决办法: ! [remote rejected] master -> master (pre-receive hook declined)
项目经理远程创建了一个空项目,无任何内容,给我赋予的developer账号权限,本地改为后提交代码试了很多次都上传不上去,报错如下: ! [remote rejected] master -> master (pre-receive hook declined)先说结果&#x…...

jQuery 遍历方法总结
遍历方法有:1、add(),用于把元素添加到匹配元素的集合中;2、children(),用于返回被选元素的所有直接子元素;3、closest(),用于返回被选元素的第一个祖先元素;4、contents(),用于返回…...
OKHttp 源码解析(二)拦截器
游戏SDK架构设计之代码实现——网络框架 OKHttp 源码解析(一) OKHttp 源码解析(二)拦截器 前言 上一篇解读了OKHttp 的基本框架源码,其中 OKHttp 发送请求的核心是调用 getResponseWithInterceptorChain 构建拦截器链…...

如何修改设置浏览器内核模式
优先级: 强制锁定极速模式 >手动切换(用户)>meta指定(开发者)>浏览器兼容列表(浏览器) 需要用360安全浏览器14,chromium108内核,下载地址https://bbs.360.cn/t…...
30个Python常用小技巧
1、原地交换两个数字 1 2 3 4 x, y 10, 20 print(x, y) y, x x, y print(x, y) 10 20 20 10 2、链状比较操作符 1 2 3 n 10 print(1 < n < 20) print(1 > n < 9) True False 3、使用三元操作符来实现条件赋值 [表达式为真的返回值] if [表达式] else [表达式…...
ubuntu解决中文乱码
1、查看当前系统使用的字符编码 ~$ locale LANGen_US LANGUAGEen_US: LC_CTYPE"en_US" LC_NUMERIC"en_US" LC_TIME"en_US" LC_COLLATE"en_US" LC_MONETARY"en_US" LC_MESSAGES"en_US" LC_PAPER"en_US" …...
2022年全国职业院校技能大赛(中职组)网络安全竞赛试题——MYSQL安全测试解析(详细)
B-3任务三:MYSQL安全测试 *任务说明:仅能获取Server3的IP地址 1.利用渗透机场景kali中的工具确定MySQL的端口,将MySQL端口作为Flag值提交; 2.管理者曾在web界面登陆数据库,并执行了select <?php echo \<pre>\;system($_GET[\cmd\]); echo \</pre>\; ?…...
C++ map和unordered_map的区别
unordered_map 类模板和 map 类模板都是描述了这么一个对象:它是由 std::pair<const Key, value> 组成的可变长容器; 这个容器中每个元素存储两个对象,也就是 key - value 对。 1. unordered_map 在头文件上,引入 <unor…...
BCSP-玄子JAVA开发之JAVA数据库编程CH-04_SQL高级(二)
BCSP-玄子JAVA开发之JAVA数据库编程CH-04_SQL高级(二) 4.1 IN 4.1.1 IN 子查询 如果子查询的结果为多个值,就会导致代码报错解决方案就是使用 IN 关键字,将 替换成 IN SELECT …… FROM 表名 WHERE 字段名 IN (子查询);4.1.…...

学习java——②面向对象的三大特征
目录 面向对象的三大基本特征 封装 封装demo 继承 继承demo 多态 面向对象的三大基本特征 我们说面向对象的开发范式,其实是对现实世界的理解和抽象的方法,那么,具体如何将现实世界抽象成代码呢?这就需要运用到面向对象的三大…...

初阶数据结构 - 【单链表】
目录 前言: 1.概念 链表定义 结点结构体定义 结点的创建 2.链表的头插法 动画演示 代码实现 3.链表的尾插 动画演示 代码实现 4.链表的头删 动画演示 代码实现 5.链表的尾删 动画演示 代码实现 6.链表从中间插入结点 动画演示 代码实现 7.从单…...
服务器硬防的应用场景都有哪些?
服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...

Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南
🚀 C extern 关键字深度解析:跨文件编程的终极指南 📅 更新时间:2025年6月5日 🏷️ 标签:C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言🔥一、extern 是什么?&…...

C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。
1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj,再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...

【笔记】WSL 中 Rust 安装与测试完整记录
#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统:Ubuntu 24.04 LTS (WSL2)架构:x86_64 (GNU/Linux)Rust 版本:rustc 1.87.0 (2025-05-09)Cargo 版本:cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...
Qt 事件处理中 return 的深入解析
Qt 事件处理中 return 的深入解析 在 Qt 事件处理中,return 语句的使用是另一个关键概念,它与 event->accept()/event->ignore() 密切相关但作用不同。让我们详细分析一下它们之间的关系和工作原理。 核心区别:不同层级的事件处理 方…...

保姆级【快数学会Android端“动画“】+ 实现补间动画和逐帧动画!!!
目录 补间动画 1.创建资源文件夹 2.设置文件夹类型 3.创建.xml文件 4.样式设计 5.动画设置 6.动画的实现 内容拓展 7.在原基础上继续添加.xml文件 8.xml代码编写 (1)rotate_anim (2)scale_anim (3)translate_anim 9.MainActivity.java代码汇总 10.效果展示 逐帧…...
全面解析数据库:从基础概念到前沿应用
在数字化时代,数据已成为企业和社会发展的核心资产,而数据库作为存储、管理和处理数据的关键工具,在各个领域发挥着举足轻重的作用。从电商平台的商品信息管理,到社交网络的用户数据存储,再到金融行业的交易记录处理&a…...
规则与人性的天平——由高考迟到事件引发的思考
当那位身着校服的考生在考场关闭1分钟后狂奔而至,他涨红的脸上写满绝望。铁门内秒针划过的弧度,成为改变人生的残酷抛物线。家长声嘶力竭的哀求与考务人员机械的"这是规定",构成当代中国教育最尖锐的隐喻。 一、刚性规则的必要性 …...

Mysql故障排插与环境优化
前置知识点 最上层是一些客户端和连接服务,包含本 sock 通信和大多数jiyukehuduan/服务端工具实现的TCP/IP通信。主要完成一些简介处理、授权认证、及相关的安全方案等。在该层上引入了线程池的概念,为通过安全认证接入的客户端提供线程。同样在该层上可…...