Spring 的 IOC 和 AOP

题目

Spring 的 IOC 和 AOP

推荐解析

IOC 是什么?

IoC(Inversion of Control) 控制反转,是一种常见的设计思想,主要就是将手动创建对象的控制权,交给 Spring 框架来管理。

为什么需要存在一个容器?

解耦,将对象之间的相互依赖的关系交给 IOC 容器管理,并让容器完成对象注入,开发者不需要知道一个 Service 依赖的其他类,只需要从容器中拿取即可。

Spring Bean

Bean:被 IOC 容器所管理的对象俗称 Bean。

Bean 可以通过 XML、注解、配置类进行定义。

一般采用注解,如下

  • @Component:通用注解

  • @Repository:持久层 DAO 层

  • @Service:服务层 Service

  • @Controller:Spring MVC 控制层

怎么注入 Bean?

通常采用注解

  • @AutoWired 按类型装配,结合 @Qualifier 可以按名称装配。

  • @Resource 按名称装配

  • @Inject 按类型进行装配

Bean 的作用域

  • Singleton:Spring 中的 Bean 默认都是单例的,是对单例设计模式的应用,有线程安全问题。

  • Prototype:每次获取都会创建一个新的 Bean 实例。没有线程安全问题。

  • Request:(仅 Web 应用可用): 每一次 HTTP 请求都会产生一个新的 Bean(请求 Bean),该 Bean 仅在当前 HTTP request 内有效。

  • Session:(仅 Web 应用可用) : 每一次来自新 session 的 HTTP 请求都会产生一个新的 Bean(会话 Bean),该 Bean 仅在当前 HTTP session 内有效。

  • Application:(仅 Web 应用可用):每个 Web 应用在启动时创建一个 Bean(应用 Bean),该 Bean 仅在当前应用启动时间内有效。

  • Websocket:(仅 Web 应用可用):每一次 WebSocket 会话产生一个新的 Bean。

Bean 的生命周期

(1)通过构造器创建 Bean 实例(无参数构造)

(2)为 Bean 的属性设置值和对其他 Bean 引用(调用 set 方法)

(3)把 Bean 实例传递 Bean 后置处理器的方法postProcessBeforeInitialization

(4)调用 Bean 的初始化的方法(需要进行配置初始化的方法)

(5)把 Bean 实例传递 Bean 后置处理器的方法 postProcessAfterInitialization

(6)Bean 可以使用了(对象获取到了)

(7)当容器关闭时候,调用 Bean 的销毁的方法(需要进行配置销毁的方法)

AOP 是什么?

SpringAOP 的意思是面向切面,利用 AOP 可以对业务逻辑的各个部分进行隔离,减少业务逻辑各部分之间的耦合度,提高程序可重用性。Spring AOP 是在 Aspecj 基础上。

AOP 术语

连接点:可以被增强的方法

切入点:真正增强的方法

通知:真正增强的代码逻辑

切面:将通知应用到切入点的过程

AOP 的应用场景

1)自定义日志一般用 @Around

2)性能统计

3)事务管理 @Transactional 代理模式,增强方法。

4)权限管理,日常用的登录判断管理员和用户,自定义注解 + AOP 即可实现。

实现 AOP 的两种方式

1)JDK 动态代理(有接口的情况)

2)CGLIB 动态代理(没有接口的情况)

SpringBoot 1 和 Spring 5 默认用 JDK 动态代理

SpringBoot 2 开始默认使用 CGLIB 动态代理,原因是没有接口依然不会报错,性能略高于 JDK 动态代理。

JDK 动态代理示例代码
public class JDKProxy {public static void main(String[] args) {//创建接口实现类的代理对象UserDaoImpl userDao = new UserDaoImpl();Class[] interfaces = {UserDao.class};UserDao dao = (UserDao) Proxy.newProxyInstance(JDKProxy.class.getClassLoader(), interfaces, new UserDaoProxy(userDao));int result = dao.add(1, 2);System.out.println("result = " + result);}
}class UserDaoProxy implements InvocationHandler {//1.把创建的是谁的代理对象,把谁传递过来//有参数构造器private Object obj;public UserDaoProxy(Object obj) {this.obj = obj;}//增强的逻辑@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {//方法之前:System.out.println("方法之前执行...." + method.getName() + ":传递的参数..." + Arrays.toString(args));//被增强的方法执行Object res = method.invoke(obj, args);//方法之后System.out.println("方法之后执行..." + obj);return res;}
}

AspectJ 定义的通知类型和返回顺序

  • 前置通知

  • 后置通知

  • 返回通知

  • 异常通知

  • 环绕通知

Spring 4 和 5 返回顺序的区别,Spring 5 将最终通知真正放到了最后。

Spring4版本
(1).正常情况
1.环绕之前通知
2.前置通知Before
3.被增强的方法
4.环绕之后通知
5.After最终通知
6.AfterReturning 后置通知
(2).异常情况
1.环绕之前通知
2.前置通知Before
3.被增强的方法
4.After最终通知
5.AfterThrowing 异常通知
Spring5版本
(1).正常情况
1.环绕之前通知
2.前置通知Before
3.被增强的方法
4.环绕之后通知
5.AfterReturning后置通知
6.After最终通知
(2).异常情况
1.环绕之前通知
2.前置通知Before
3.被增强的方法
4.AfterThrowing异常通知
5.After最终通知

其他补充

1. 什么是 Spring 的 IOC(控制反转)?

IOC(Inversion of Control)是一种设计模式,它反转了传统的程序设计思路。在传统的程序设计中,程序员控制应用程序的流程和对象的创建,而在 IOC 容器中,控制权被反转了。在 Spring 中,IOC 容器负责创建对象、管理对象之间的依赖关系,使得程序员只需关注业务逻辑的编写。

Spring 的 IOC 实现方式主要有两种:

  • BeanFactory: 是 Spring 框架最基础的 IOC 容器,提供了基本的 IOC 功能,是延迟加载的。在使用时才加载对象。

  • ApplicationContext: 继承于 BeanFactory,提供了更多的企业级功能,是一种预加载的 IOC 容器。在容器启动时就加载并初始化所有的单例对象。

2. 什么是 Spring 的 AOP(面向切面编程)?

AOP 是一种编程范式,通过在程序中定义横切关注点(Cross-cutting Concerns),将这些关注点与核心业务逻辑分离。在 Spring 中,AOP 通过代理模式实现,允许开发者将横切关注点模块化,提高代码的可维护性和可重用性。

AOP 的关键概念:

  • 切面(Aspect): 封装横切关注点的模块,可以在程序中的多个地方被重用。

  • 连接点(Join Point): 在程序执行过程中能够插入切面的点,通常是方法的执行。

  • 通知(Advice): 切面对于连接点执行的操作,包括“前置通知”(Before Advice)、“后置通知”(After Advice)、“异常通知”(After Throwing Advice)、“最终通知”(After Returning Advice)、“环绕通知”(Around Advice)。

  • 切入点(Pointcut): 定义了一组连接点,可以通过表达式匹配到横切关注点。

3. 为什么需要 IOC 和 AOP ?

  • IOC 的优势:

    • 松耦合: 通过 IOC 容器管理对象之间的依赖关系,减少了类与类之间的直接耦合,提高了代码的灵活性和可维护性。

    • 可测试性: 依赖注入使得测试时更容易替换掉依赖的实现,进行单元测试。

    • 模块化: 将对象的创建和管理交由 IOC 容器,使得应用的模块更容易独立开发、测试和维护。

  • AOP 的优势:

    • 横切关注点模块化: 将横切关注点从核心业务逻辑中分离,提高了代码的可重用性和可维护性。

    • 降低重复代码: 通过切面,可以在多个模块中共享相同的横切关注点,避免了代码重复。

4. 应用场景:

  • IOC 的应用场景:

    • 大型项目中,通过 IOC 容器管理复杂的对象依赖关系,提高了代码的灵活性和可维护性。

    • 使用框架(如 Spring MVC )时,由容器负责创建和管理 Controller、Service 等组件。

  • AOP 的应用场景:

    • 日志记录、性能监控、事务管理等横切关注点的模块化。

    • 权限控制、异常处理等与业务逻辑分离的模块。

5. 优缺点:

  • IOC 的优缺点:

    • 优点:松耦合、可测试性、模块化。

    • 缺点:学习成本较高,理解 IOC 容器的运作机制需要一定的时间。

  • AOP 的优缺点:

    • 优点:横切关注点模块化、降低重复代码。

    • 缺点:增加了系统的复杂性,理解和维护成本较高。

Bean 生命周期图

图片

推荐书籍

欢迎交流

在阅读完本篇文章之后,你应该对 Spring 的 IOC 和 AOP 的概念以及应用场景等等有了相应的理解,可以加入群聊一起共同学习讨论,欢迎小伙伴在评论区交流关于 Spring 学习的见解。

1)请解释依赖注入是如何工作的?

2)如何实现延迟加载的 Bean?

3)举例一些适合实验 AOP 的场景,并解释为什么选择 AOP,对比其他技术。

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

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

相关文章

SpringCloud Alibaba Sentinel 与 SpringCloud Gateway 的限流有什么差别?(三种限流算法原理分析)

目录 一、Sentinel 与 Gateway 的限流有什么差别? 1.1、前置知识 - 四种常见的限流算法 1.1.1、Tips 1.1.2、计数器算法 1)固定窗口计数器算法 2)滑动窗口计数器算法 1.1.3、令牌桶算法 1.1.4、漏桶算法 1.2、解决问题 一、Sentinel…

Qt Designer教程

文章目录 创建一个 ui 文件选择控件Qt Designer基本控件介绍1、Layouts1.1、Layouts 布局1.2、参数配置 2、Spacers2.1、 Spacers 弹簧介绍2.2、 参数设置 3、Buttons 按键3.1、 Buttons 按键分类 4、Item Views(Model-Based) 项目视图(基于模型)4.1、 B…

12.for 条件循环语句 (3)

for 循环语句 允许脚本一次性读取多个信息,然后逐一对信息进行操作处理。当要处理的数据有范围时,使用for循环语句。 使用 for 循环语句从列表文件中读取多个用户名,然后为其逐一创建用户账户并设 置密码。首先创建用户名称的列表文件users.…

android studio从空白开始

对我来说,真正的第一步是清理电脑C盘。从剩余8G清理到25G,把原来看不顺眼又不敢删的文件夹和软件全删了,删爽了的后果就是,用两天的时间在把一些环境配置慢慢装回来,node.js,jdk,npm。努力把它们…

密码学中的承诺原语(Commitment Scheme)

1背景介绍 让我们考虑以下情况:Alice在佳士得(Christies)购买Banksy的最后一件杰作,在这之前,她会确保艺术品在售出后不会被销毁。 佳士得选择了维克里封闭竞标的拍卖方式,这是一种相当常见的做法&#x…

Vue+Element(el-upload+el-form的使用)+springboot

目录 1、编写模板 2、发请求调接口 3、后端返回数据 1.编写实体类 2.Controller类 3、interface接口(Service层接口) 4.Service(接口实现) 5、interface接口(Mapper层接口) 6、xml 4、upload相关参…

前端 防止浏览器提示记住密码以及自动填充密码

当前端 <input /> 的 type’password‘ 时&#xff0c;浏览器为了优化用户体验&#xff0c;会在表单提交后提示用户记住密码 如果不想要这样的行为&#xff0c;最简单的当然是提示用户自己在浏览器设置中进行相关配置 如果希望在代码层面阻止浏览器提示是否记住密码或者…

.git 文件夹结构解析

.git 文件夹结构解析 在这篇文章就让我们来看看这个 Git 仓库里的文件分别都是用来干什么的&#xff0c;以及在执行了相关的 Git 命令后这些文件会如何响应。 hooks&#xff08;钩&#xff09;&#xff1a;存放一些shell脚本info&#xff1a;存放仓库的一些信息logs&#xff…

ChromeDriver谷歌驱动最新版安装120/121/122

chromeDriver最新版本下载 最新驱动 https://googlechromelabs.github.io/chrome-for-testing/参考&#xff1a; https://blog.csdn.net/m0_57382185/article/details/134007615

ORM-02-Hibernate 对象关系映射(ORM)框架

拓展阅读 The jdbc pool for java.(java 手写 jdbc 数据库连接池实现) The simple mybatis.&#xff08;手写简易版 mybatis&#xff09; Hibernate Hibernate ORM 允许开发者更轻松地编写那些数据在应用程序进程结束后仍然存在的应用程序。 作为一个对象关系映射&#xff08…

基于蝗虫优化的KNN分类特征选择算法的matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 4.1 KNN分类器基本原理 4.2 特征选择的重要性 4.3 蝗虫优化算法&#xff08;GOA&#xff09; 5.完整程序 1.程序功能描述 基于蝗虫优化的KNN分类特征选择算法。使用蝗虫优化算法&#xff…

C++入门语法———命名空间,缺省参数,重载函数

文章目录 一.命名空间1.存在意义2.语法使用1.定义命名空间2.使用命名空间的三种方式 二.缺省参数1.全缺省参数2.半缺省参数 三.重载函数1.定义2.重载原理———名字修饰 一.命名空间 1.存在意义 C命名空间的主要意义是为了避免命名冲突&#xff0c;尤其是在大型项目中可能存在…

“高级SPA项目构建与路由实现“

目录 引言1. SPA项目构建1.1 安装vue-cli,webpack1.2 创建 Vue.js项目1.3 “一问一答”模式1.4 启动项目 2. SPA项目完成路由3. 基于SPA项目完成嵌套路由总结 引言 在现代Web开发中&#xff0c;单页应用&#xff08;SPA&#xff09;已经成为一种流行的开发模式。SPA通过在前端…

优优嗨聚:美团代运营服务,为商家赋能,打造流量转化的秘密武器

随着互联网的飞速发展&#xff0c;人们越来越依赖线上平台进行消费。作为国内领先的电商平台之一&#xff0c;美团吸引了众多商家入驻。然而&#xff0c;如何在竞争激烈的美团平台上脱颖而出&#xff0c;成为了商家们面临的一大挑战。此时&#xff0c;美团代运营服务应运而生&a…

HTML5和CSS3的新特性

HTML5的新特性主要是针对于以前的不足&#xff0c;增加了一些新的标签、新的表单和新的表单属性等 1&#xff0c;HTML5新增的语义化标签 <header> 头部标签 <nav> 导航标签 <article> …

《WebKit 技术内幕》学习之九(4): JavaScript引擎

4 实践——高效的JavaScript代码 4.1 编程方式 关于如何使用JavaScript语言来编写高效的代码&#xff0c;有很多铺天盖地的经验分享&#xff0c;以及很多特别好的建议&#xff0c;读者可以搜索相关的词条&#xff0c;就能获得一些你可能需要的结果。同时&#xff0c;本节希望…

记录centos安装nginx过程和问题

今天在centos上安装了nginx&#xff0c;遇到了些问题&#xff0c;记录一下。 使用yum直接安装的话安装的版本是1.20.1&#xff0c;使用源码包安装可以装到1.25.0&#xff08;最新稳定版&#xff09;。很有意思的一点是两种安装方法下安装的路径是不同的&#xff0c;且源码安装…

Java 面向对象案例 03(黑马)

代码&#xff1a; public class phoneTest {public static void main(String[] args) {phone [] arr new phone[3];phone p1 new phone("华为",6999,"白色");phone p2 new phone("vivo",4999,"蓝色");phone p3 new phone("苹…

手把手教你用深度学习做物体检测(一): 快速感受物体检测的酷炫

我们先来看看什么是物体检测&#xff0c;见下图&#xff1a; 如上图所示&#xff0c; 物体检测就是需要检测出图像中有哪些目标物体&#xff0c;并且框出其在图像中的位置。 本篇文章&#xff0c;我将会介绍如何利用训练好的物体检测模型来快速实现上图的效果&#xff0c;这里…

Pyside6中QTableWidget使用

目录 一&#xff1a;介绍&#xff1a; 二&#xff1a;演示 一&#xff1a;介绍&#xff1a; 在 PySide6 中&#xff0c;QTableWidget 是一个用于展示和编辑表格数据的控件。它提供了在窗口中创建和显示表格的功能&#xff0c;并允许用户通过单元格来编辑数据。 要使用 QTabl…