【日积月累】Spring中的AOP与IOC相关问题详解

Spring中的AOP与IOC

  • 1.前言
  • 2.Spring AOP(面向切面编程)
    • 2.1 AOP的实现过程
    • 2.2 AOP代理模式的类型
      • 2.2.1JDK的动态代理
      • 2.2.2CGLIB的动态代理
    • 2.3AOP应用常见场景
      • 2.3.1日志记录
    • 2.4对AOP的理解
  • 3.Spring IOC(Inversion of Control,控制反转)
    • 3.1使用Spring IOC 的好处
    • 3.2使用Spring IOC 依赖注入的方式
      • 3.2.1通过xml文件注入
      • 3.2.2通过注解注入
    • 3.3IOC的理解
  • 4.参考


文章所属专区 日积月累


1.前言

本文主要针对Spring中两大特性,AOP和IOC,并针对他们的使用常见,结合面试常见问题,实现代码,进行解析。

2.Spring AOP(面向切面编程)

在使用Java语言进行代码编写时,由于Java语言的特性,会有一些弊端,比如在处理一些不具有继承关系的一些类的公共行为时,只能在每个对象引用公共行为,会出现大量重复代码,会造成大量代码冗余,这样不仅浪费时间,也不方便维护,AOP的出现解决了这一个问题。

2.1 AOP的实现过程

Spring中的AOP基于代理模式,首先会自定义一个注解;
其次,定义一个切面(Aspect)类,在切面中定义切点和通知,切点(方法的拦截规则),在使用了这个注解的方法会被拦截下来,拦截下来之后;
最后可以进行前置通知、后置通知、异常通知、返回通知还是环绕通知等。

2.2 AOP代理模式的类型

代理类可以分为两类 动态代理(Dynamic Proxy)和静态代理(Static Proxy)Spring AOP(面向切面编程)中主要是运用了动态代理的方式来实现:在运行过程中通过反射机制动态创建而成,无需手动编写代码。

2.2.1JDK的动态代理

JDK动态代理是Spring AOP默认使用的方式,主要用于对实现了接口的类生成代理。JDK动态代理主要涉及到java.lang.reflect包中的两个类:Proxy和InvocationHandler。InvocationHandler是一个接口,通过实现该接口定义横切逻辑,并通过反射机制调用目标类的代码,动态将横切逻辑和业务逻辑编制在一起。Prox则利用InvocationHandler动态创建一个符合某一接口的实例,生成目标类的代理对象

2.2.2CGLIB的动态代理

CGLIB(Code Generation Library)是针对类实现代理的,主要是对指定的类生成一个子类,覆盖其中的方法(继承)。CGLIB是一个强大的高性能,高质量的代码生成类库,可以在运行期扩展Java类与实现Java接口。CGLIB封装了asm,可以再运行期动态生成新class

2.3AOP应用常见场景

比如日志记录,性能优化,权限控制,内容传递,错误处理,事务管理,限流等。

2.3.1日志记录

在Spring AOP中,可以使用@AspectJ注解定义一个切面,然后在切面方法中添加@Before或@After注解,用于在方法执行前后插入相应的日志记录逻辑

2.4对AOP的理解

AOP是Spring框架中最核心的两个点之一,它可以减少重复代码,降低模块间的耦合性,提高代码的可操作性和可维护性。在实际工作中,除了业务代码之外,还经常会接触到与业务无关的一些组件,比如日志,权限,事务等常见的核心服务组件,如果为每个业务代码单独添加这些组件,会出现大量的冗余代码,因此我们将这些公共的代码逻辑抽象出来成为一个切面,然后注入到具体业务中去。AOP就是通过这样一种方式,通过动态代理的方式,来对需要注入切面的对象进行代理,在进行调用时,直接将公共逻辑添加进去,而不需要修改原有的业务代码,在不改变原有业务代码的情况下做了代码功能的增强。

3.Spring IOC(Inversion of Control,控制反转)

在传统的软件设计过程中,通常由调用者来创建被调用者的实例。但在Spring中创建被调用者的工作不在由调用者来完成,这就是控制反转。IOC是一种设计思想,即把原本在程序中手动创建对象的控制权交给了Spring框架中的IOC容器,让它去创建和管理这些对象。在Spring中实现IOC主要依靠DI(Dependency Injection 依赖注入) 来实现。

3.1使用Spring IOC 的好处

在 Spring 中, IoC 容器是 Spring 用来实现 IoC 的载体, IoC 容器实际上就是个 Map(key,value),Map 中存放的是各种对象。

  1. 由于资源不再由使用资源的双方管理,因此,资源可以集中管理,实现资源的可配置和易管理
  2. 降低了使用资源双方的依赖程度(低耦合度)。

3.2使用Spring IOC 依赖注入的方式

3.2.1通过xml文件注入

属性注入(property)、构造器注入(constructor-arg)、自动装配通过对bean的autowrite属性指定(byName、byType)

3.2.2通过注解注入

这种方式后来在 SpringBoot 中常用 ,@autowrite @resource @component等

3.3IOC的理解

IOC 控制反转:

在没有使用IOC容器之前,都是由程序员来控制对象,而有了IOC容器之后,则由IOC容器来控制对象;
控制的是实现过程中所需要的对象以及依赖的对象;
在没有使用IOC之前,我们都需要主动在对象中创建依赖的对象,这种正转的,而有了IOC之后,依赖的对象由IOC创建后注入到对象中,由主动创建变成了被动接受,这是反转;
IOC是一种思想,DI(依赖注入:把对应的属性的值注入到对象)是具体的实现方式 @AutoWried

IOC 容器(Spring用来实现IOC的载体,实际是个Map(Key,value),Map中存放的是各种对象):

在Spring中一般存在三级缓存,singletonObject存放完整的Bean对象,整个Bean的生命周期,从创建到使用到销毁全部都由容器来控制。

4.参考

谈谈对IOC的理解
Spring AOP的理解与使用
面试被问了几百遍的 IoC 和 AOP ,还在傻傻搞不清楚?

给个三连吧 谢谢谢谢谢谢了

在这里插入图片描述

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

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

相关文章

29、Windows安全配置

文章目录 一、Windows安全配置简介二、账户策略2.1 密码策略2.2 账户锁定策略 三、本地策略3.1 用户权限分配 四、安全设置4.1 账户4.2 审核4.3 设备4.4交互式登录4.5 网络访问4.6 网络安全4.7 用户账户控制4.8 防火墙配置 五、高级审核策略设置5.1 账户登录5.2 账户管理5.3 对…

架构设计系列之基础:基础理论(一)

在软件开发和软件架构领域,深厚的理论基础是构建高质量、可维护、可扩展系统的关键,本部分内容将围绕这些基础理论展开。(本部分内容介绍第一部分:编程三范式、架构设计原则、软件设计七原则) 一、编程三范式 编程范…

112. 路径总和(Java)

目录 解法: 官方解法: 方法一:广度优先搜索 思路及算法 复杂度分析 时间复杂度: 空间复杂度: 方法二:递归 思路及算法 复杂度分析 时间复杂度: 空间复杂度: 给你二叉树的…

(C++)最大连续1的个数--滑动窗口

个人主页:Lei宝啊 愿所有美好如期而遇 力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://le…

MIT18.06线性代数 笔记2

文章目录 正交向量与子空间子空间投影投影矩阵和最小二乘正交矩阵和Gram-Schmidt正交化行列式及其性质行列式公式和代数余子式克拉默法则、逆矩阵、体积特征值和特征向量对角化和A的幂微分方程和exp(At)马尔科夫矩阵 傅里叶级数复习二 正交向量与子空间 向量正交:x…

【初阶C++】前言

C前言 1. 什么是C2. C发展史3. C的重要性4. 如何学习C 1. 什么是C C语言是结构化和模块化的语言,适合处理较小规模的程序。对于复杂的问题,规模较大的程序,需要高度的抽象和建模时,C语言则不合适。为了解决软件危机, …

【Linux系统编程二十一】:(进程通信3)--消息队列/信号量(system v标准的内核数据结构的设计模式)

【Linux系统编程二十】:消息队列/信号量(system v标准的内核数据结构的设计模式) 一.消息队列二.system v标准的内核数据结构的设计三.四个概念(互斥/临界)四.信号量1.多线程并发访问2.计数器3.原子的4.总结 一.消息队列 一个叫做a进程啊,一个…

如何将LLMs封装成应用并在本地运行

最近我一直在致力于Ollama的工作,因此我花了很多时间思考如何在本地系统上运行大型语言模型(LLMs)以及如何将它们打包成应用程序。对于使用LLMs的大多数桌面应用程序而言,通常的体验要么是插入OpenAI API密钥,要么是从…

protobuf基础学习

部分内容出自:https://blog.csdn.net/baidu_32237719/article/details/99723353 proto文件来预先定义的消息格式。数据包是按照proto文件所定义的消息格式完成二进制码流的编码和解码。proto文件,简单地说,就是一个消息的协议文件&#xff0c…

MAC IDEA Maven Springboot

在mac中,使用idea进行maven项目构建 环境配置如何运行maven项目1.直接在IDEA中运行2.使用jar打包后执行 如何搭建spring boot1.添加依赖2.创建入口类3.创建控制器4. 运行5.其他 环境配置 官网安装IDEA使用IDEA的创建新项目选择创建MAEVEN项目测试IDEA的MAVEN路径是…

【二分查找】【双指针】LeetCode:2565最少得分子序列

作者推荐 【动态规划】【广度优先】LeetCode2258:逃离火灾 本文涉及的基础知识点 二分查找算法合集 有序向量的二分查找,初始化完成后,向量不会修改。 双指针: 用于计算子字符串是s的字符串的子系列。 题目 给你两个字符串 s 和 t 。 你…

《地理信息系统原理》笔记/期末复习资料(10. 空间数据挖掘与空间决策支持系统)

目录 10. 空间数据挖掘与空间决策支持系统 10.1. 空间数据挖掘 10.1.1. 空间数据挖掘的概念 10.1.2. 空间数据挖掘的方法与过程 10.1.3. 空间数据挖掘的应用 10.2. 空间决策支持系统 10.2.1. 空间决策支持系统的概念 10.2.2. 空间决策支持系统的结构 10.2.3. 空间决策…

基于chaos混沌的彩色图像加解密系统matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 混沌理论简介 4.2 基于混沌的图像加密原理 4.3 数学公式与实现过程 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 .................…

记录将C语言编写的Windows程序转换为python语言编写,演示具体效果在最后,这对初学者理解Windows消息机制及框架有一定参考作用

主要思路 由于C语言的数组定义使用名字加中括号及括号内数字定义,但是在python中【】已经被作为列表 元组等序列类型分片、存取元素,因此我们不能像C语言那样定义数组 例如C语言 int a[10] 是声明定义一个含有10个int类型的数组a,而在执行语句部分…

华为OD机试真题B卷 Java 实现【统计大写字母个数】,附详细解题思路

一、题目描述 找出给定字符串中大写字符(即’A’-‘Z’)的个数。 数据范围:字符串长度:1≤∣s∣≤250 字符串中可能包含空格或其他字符 二、输入描述 对于每组样例,输入一行,代表待统计的字符串。 三、输出描述 输出一个整…

【css】css实现文字两端对齐效果:

文章目录 一、方法1:二、方法2:三、注意: 一、方法1: 给元素设置 text-align: justify;text-align-last: justify;并且加上text-justify: distribute-all-line; 目的是兼容ie浏览器 p{width: 130px;text-align: justify;text-alig…

飞天使-linux操作的一些技巧与知识点3-http的工作原理

文章目录 http工作原理nginx的正向代理和反向代理的区别一个小技巧dig 命令巧用 http工作原理 http1.0 协议 使用的是短连接,建立一次tcp连接,发起一次http的请求,结束,tcp断开 http1.1 协议使用的是长连接,建立一次tc…

Network 灰鸽宝典【目录】

目前已有文章 21 篇 Network 灰鸽宝典专栏主要关注服务器的配置,前后端开发环境的配置,编辑器的配置,网络服务的配置,网络命令的应用与配置,windows常见问题的解决等。 文章目录 服务配置环境部署GitNPM 浏览器编辑器系…

GEE:重分类

作者:CSDN @ _养乐多_ 本文记录了在 Google Earth Engine(GEE)平台上对一副类别图像进行重分类的代码。并以 COPERNICUS/Landcover/100m/Proba-V-C3/Global 数据集中的土地利用数据为例。 结果如下图所示, 文章目录 一、核心函数二、示例代码三、代码链接一、核心函数 核…

文件操作及函数

什么是文件? 在程序设计中,文件有两种:程序文件和数据文件。 程序文件 包括源程序文件(.c),目标文件(.obj),可执行程序(.exe)。 数据文件 文件的内容不一定是程序&…