Spring 框架基础:IOC 与 AOP 原理剖析及面试要点

在上一篇中,我们深入探讨了 Java 反射机制,了解了它在运行时动态操作类和对象的强大能力。而今天,我们将进入 Spring 框架的世界。Spring 框架作为 Java 企业级开发中最流行的框架之一,极大地简化了企业级应用的开发过程。对于春招面试而言,Spring 框架的基础知识是重点考察内容,其中控制反转(IOC)和面向切面编程(AOP)是 Spring 框架的核心思想,下面我们来详细了解。

一、控制反转(IOC)

概念与原理

IOC,即控制反转(Inversion of Control),是一种设计思想,它将对象的创建和管理控制权从应用程序本身转移到了 Spring 容器中。在传统的 Java 开发中,对象的创建和依赖关系的管理由开发者在代码中手动完成,这使得代码的耦合度较高,可维护性和可测试性较差。而在 Spring 框架中,通过 IOC 容器,开发者只需将对象的定义和依赖关系配置在 XML 文件或使用注解的方式告诉 Spring 容器,由容器负责创建对象并管理它们之间的依赖关系。

IOC 的实现主要依赖于依赖注入(Dependency Injection,DI)。依赖注入是 IOC 的一种具体实现方式,它有三种常见的注入方式:构造函数注入、Setter 方法注入和接口注入(较少使用)。以构造函数注入为例:

public class UserService {private UserDao userDao;// 构造函数注入public UserService(UserDao userDao) {this.userDao = userDao;}public void saveUser() {userDao.save();}
}public interface UserDao {void save();
}public class UserDaoImpl implements UserDao {@Overridepublic void save() {System.out.println("保存用户到数据库");}
}

在 Spring 配置文件(XML)中可以这样配置:

<bean id="userDao" class="com.example.dao.UserDaoImpl"/>
<bean id="userService" class="com.example.service.UserService"><constructor-arg ref="userDao"/>
</bean>

这样,Spring 容器在创建userService对象时,会自动将userDao对象通过构造函数注入进去。

面试题 1:IOC 的优点是什么?

答案

  • 降低耦合度:对象之间的依赖关系由 Spring 容器管理,对象无需关心其依赖对象的创建和实现细节,只需要关注自身的业务逻辑,从而降低了代码的耦合度,提高了代码的可维护性和可扩展性。例如,当UserDao的实现类发生变化时,只需要在 Spring 配置文件中修改userDao的class属性,而UserService类的代码无需修改。
  • 提高可测试性:由于对象的依赖关系可以通过外部配置进行注入,在测试时可以很方便地为对象提供模拟的依赖对象,从而提高了代码的可测试性。比如在测试UserService时,可以创建一个模拟的UserDao实现类,通过 Spring 容器注入到UserService中,方便对UserService的业务逻辑进行单独测试。
  • 方便管理和维护:Spring 容器集中管理对象的创建和生命周期,便于对对象进行统一的管理和维护,如对象的初始化、销毁等操作都可以由 Spring 容器进行控制。

面试题 2:说说 IOC 容器的工作流程?

答案

  • 资源定位:Spring 容器首先会根据配置文件的位置(如 XML 文件路径或基于注解的配置类)来定位资源。如果是 XML 配置,会读取 XML 文件;如果是基于注解的配置,会扫描指定的包路径来查找被注解标记的类。
  • BeanDefinition 载入:将配置文件中的信息解析成BeanDefinition对象,BeanDefinition包含了创建 Bean 所需的各种信息,如类名、构造函数参数、属性值、依赖关系等。
  • BeanDefinition 注册:将解析后的BeanDefinition注册到BeanDefinitionRegistry中,BeanDefinitionRegistry是 Spring 容器中用于管理BeanDefinition的核心接口,它负责维护所有已注册的BeanDefinition。
  • Bean 实例化:Spring 容器根据BeanDefinition中的信息,通过反射机制创建 Bean 实例。在实例化过程中,如果 Bean 有依赖关系,会递归地实例化其依赖的 Bean,并将它们注入到当前 Bean 中。例如,在创建userService时,会先创建userDao并注入到userService中。
  • Bean 初始化:在 Bean 实例化后,Spring 会对 Bean 进行初始化操作,如调用 Bean 的初始化方法(可以通过init-method属性指定),以及对 Bean 进行一些后置处理(如 AOP 代理的创建等)。
  • Bean 使用:完成初始化后,Bean 就可以被应用程序使用了。当应用程序需要获取某个 Bean 时,从 Spring 容器中获取即可。
  • Bean 销毁:当 Spring 容器关闭时,会对 Bean 进行销毁操作,如调用 Bean 的销毁方法(可以通过destroy-method属性指定),释放 Bean 占用的资源。

二、面向切面编程(AOP)

概念与原理

AOP,即面向切面编程(Aspect - Oriented Programming),它是一种编程范式,旨在将横切关注点(如日志记录、事务管理、权限控制等)从业务逻辑中分离出来,以提高代码的模块化和可维护性。在 Spring 框架中,AOP 通过代理模式实现,主要有 JDK 动态代理和 CGLIB 代理两种方式。

在 AOP 中,有几个关键概念:

  • 切面(Aspect):一个切面是横切关注点的模块化,它包含了一组通知和切入点的定义。例如,一个用于日志记录的切面,包含了在方法执行前后记录日志的通知以及定义哪些方法需要被记录日志的切入点。
  • 通知(Advice):通知是切面在某个连接点上执行的操作,包括前置通知(Before Advice)、后置通知(After Advice)、环绕通知(Around Advice)、异常通知(After - throwing Advice)和最终通知(After - returning Advice)。比如前置通知在方法执行前执行,可用于权限检查;环绕通知可以在方法执行前后都执行自定义逻辑,常用于事务管理。
  • 连接点(Joinpoint):连接点是程序执行过程中的某个特定点,如方法调用、异常抛出等。在 Spring AOP 中,连接点主要指方法调用。
  • 切入点(Pointcut):切入点定义了哪些连接点会被织入通知,它是一组连接点的集合。通过切入点表达式可以精确地指定哪些方法需要应用切面的通知。例如,execution(* com.example.service.*.*(..))表示com.example.service包下所有类的所有方法都是切入点。

以一个简单的日志切面为例,使用注解方式配置:

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;@Aspect
@Component
public class LogAspect {@Around("execution(* com.example.service.*.*(..))")public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable {System.out.println("方法开始执行: " + joinPoint.getSignature().getName());Object result = joinPoint.proceed();System.out.println("方法执行结束: " + joinPoint.getSignature().getName());return result;}
}

上述代码定义了一个日志切面LogAspect,使用@Around注解定义了一个环绕通知,切入点表达式为execution(* com.example.service.*.*(..)),表示对com.example.service包下所有类的所有方法进行日志记录。

面试题 3:AOP 有哪些应用场景?

答案

  • 日志记录:在方法执行前后记录日志,用于记录系统的操作日志,方便追踪和调试。如记录用户的登录操作、订单的创建和修改操作等。
  • 事务管理:通过 AOP 可以将事务管理的逻辑从业务代码中分离出来,在方法执行前后自动开启和提交事务,或者在出现异常时回滚事务。例如在一个电商系统中,商品的下单、库存扣减等操作需要在一个事务中进行,通过 AOP 可以很方便地实现事务管理。
  • 权限控制:在方法执行前进行权限检查,确保只有具有相应权限的用户才能访问特定的方法。比如在一个后台管理系统中,只有管理员用户才能执行删除用户的操作,通过 AOP 可以在删除用户方法执行前进行权限校验。
  • 性能监控:通过 AOP 可以在方法执行前后记录时间,计算方法的执行时间,用于性能监控和优化。例如在一个高并发的系统中,对一些核心业务方法进行性能监控,找出性能瓶颈。

掌握 Spring 框架的 IOC 和 AOP 原理,是理解和使用 Spring 框架的关键。下一篇,我们将深入探讨 Spring MVC 相关知识,继续为你的春招面试助力。

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

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

相关文章

密码无关认证:金融机构如何解决密码问题

密码安全问题&#xff0c;依然是金融行业面临的重大挑战。尽管密码简单易用&#xff0c;但许多金融机构仍然依赖这种方式进行身份认证。幸运的是&#xff0c;随着技术的发展&#xff0c;密码无关认证已经成为一种更加安全、便捷的选择&#xff0c;它能够为数字银行带来更好的用…

【Redis】持久化机制

目录 前言&#xff1a; RDB 触发RDB持久化方法有俩种&#xff1a; 1.手动触发 2.自动触发 RDB文件的优缺点&#xff1a; AOF: AOF工作机制&#xff1a;​编辑 ​编辑重写机制&#xff1a; 前言&#xff1a; Redis是一个内存数据库&#xff0c;将数据存储在内存中&…

Vue基础(2)

19、组件之间传递数据 组件与组件之间不是完全独立的&#xff0c;而是有交集的&#xff0c;那就是组件与组 件之间是可以传递数据的 传递数据的解决方案就是 props ComponentA.vue <template><!-- 使用ComponentB组件&#xff0c;并传递title属性 --><h3>…

Java操作Excel导入导出——POI、Hutool、EasyExcel

目录 一、POI导入导出 1.数据库导出为Excel文件 2.将Excel文件导入到数据库中 二、Hutool导入导出 1.数据库导出为Excel文件——属性名是列名 2.数据库导出为Excel文件——列名起别名 3.从Excel文件导入数据到数据库——属性名是列名 4.从Excel文件导入数据到数据库…

08-ArcGIS For JavaScript-通过Mesh绘制几何体(Cylinder,Circle,Box,Pyramid)

目录 概述代码实现1、Mesh.createBox2、createPyramid3、Mesh.createSphere4、Mesh.createCylinder 完整代码 概述 对于三维场景而言&#xff0c;二位的点、线、面&#xff0c;三维的圆、立方体、圆柱等都是比较常见的三维对象&#xff0c;在ArcGIS For JavaScript中我们知道点…

DAY6,使用互斥锁 和 信号量分别实现5个线程之间的同步

题目 请使用互斥锁 和 信号量分别实现5个线程之间的同步 代码&#xff1a;信号量实现 void* task1(void* arg); void* task2(void* arg); void* task3(void* arg); void* task4(void* arg); void* task5(void* arg);sem_t sem[5]; //信号量变量int main(int argc, const …

19_PlayerPres持久化_创建角色窗口

创建脚本 编写脚本 using UnityEngine; //功能 : 角色创建界面 public class CreateWnd : WindowsRoot{protected override void InitWnd(){base.InitWnd();//TODO//显示一个随机名字} }创建角色窗口CreateWnd.cs应该在玩家点击 进入游戏 按钮后显示 所以在 登录窗口LoginWnd…

热更新杂乱记

热更新主要有一个文件的MD5值的比对过程&#xff0c;期间遇到2个问题&#xff0c;解决起来花费了一点时间 1. png 和 plist 生成zip的时候再生成MD5值会发生变动。 这个问题解决起来有2种方案&#xff1a; &#xff08;1&#xff09;.第一个方案是将 png和plist的文件时间改…

【2024年华为OD机试】 (C卷,100分)- 用户调度问题(JavaScriptJava PythonC/C++)

一、问题描述 问题描述 在通信系统中&#xff0c;有 n 个待串行调度的用户&#xff0c;每个用户可以选择 A、B、C 三种调度策略。不同的策略会消耗不同的系统资源。调度规则如下&#xff1a; 相邻用户不能使用相同的调度策略&#xff1a;例如&#xff0c;如果第 1 个用户选择…

FPGA中场战事

2023年10月3日,英特尔宣布由桑德拉里维拉(Sandra Rivera)担任“分拆”后独立运营的可编程事业部首席执行官。 从数据中心和人工智能(DCAI)部门总经理,转身为执掌该业务的CEO,对她取得像AMD掌门人苏姿丰博士类似的成功,无疑抱以厚望。 十年前,英特尔花费167亿美元真金白银…

从手动到智能:自动化三维激光扫描

三维扫描&#xff0c;是通过先进三维扫描技术获取产品和物体的形面三维数据&#xff0c;建立实物的三维图档&#xff0c;满足各种实物3D模型数据获取、三维数字化展示、3D多媒体开发、三维数字化存档、逆向设计、产品开发、直接3D打印制造或辅助加工制造等一系列的应用。 传统的…

电容的一些常用数值

如果是滤高频信号的小电容一般采用100nF 如果是滤低频信号的大电容一般采用10uF(10000nF) 比如这个LDO降压 两个一起用滤波效果会更好 如果想要供电引脚悬空&#xff0c;按理不能悬空&#xff0c;所以应该接大电阻接地&#xff0c;一般采用5.1KΩ 比如这个6Pin USB-TypeC的…

编写子程序

实验内容、程序清单及运行结果 编写子程序&#xff08;课本实验10&#xff09; 1.显示字符串 问题显示字符串是现象工作中经常用到的功能&#xff0c;应该编写一个通用的子程序来实现这个功能。我们应该提供灵活的调用接口&#xff0c;使调用者可以决定显示的位置&#xff0…

亚马逊新店铺流量怎么提升?自养号测评新趋势

在竞争激烈的电商市场中&#xff0c;亚马逊新店铺如何在众多竞争者中脱颖而出&#xff0c;提升流量成为一大难题。对于新手卖家来说&#xff0c;掌握正确的流量提升策略至关重要。本文将为您揭秘亚马逊新店铺流量提升的方法&#xff0c;助您快速打开市场&#xff0c;实现业绩增…

FPGA自分频产生的时钟如何使用?

对于频率比较小的时钟&#xff0c;使用clocking wizard IP往往不能产生&#xff0c;此时就需要我们使用代码进行自分频&#xff0c;自分频产生的时钟首先应该经过BUFG处理&#xff0c;然后还需要进行时钟约束&#xff0c;处理之后才能使用。

JQuery基本介绍和使用方法

JQuery基本介绍和使用方法 W3C 标准给我们提供了⼀系列的函数, 让我们可以操作: ⽹⻚内容⽹⻚结构⽹⻚样式 但是原⽣的JavaScript提供的API操作DOM元素时, 代码⽐较繁琐, 冗⻓. 我们可以使⽤JQuery来操作⻚⾯对象. jQuery是⼀个快速、简洁且功能丰富的JavaScript框架, 于20…

Go语言中的值类型和引用类型特点

一、值类型 值类型的数据直接包含值&#xff0c;当它们被赋值给一个新的变量或者作为参数传递给函数时&#xff0c;实际上是创建了原值的一个副本。这意味着对新变量的修改不会影响原始变量的值。 Go中的值类型包括&#xff1a; 基础类型&#xff1a;int&#xff0c;float64…

15-spring整合mybatis方式一

spring整合mybatis 方式一【重要】 步骤: 1.导入相关jar包 junit mybatis mysql数据库 spring相关的 aop织入 mybatis-spring 【new】 junit junit 4.12 mysql mysql-connector-java 8.0.23 org.mybatis mybatis 3.5.2 org.springframework spring-webmvc 5…

豆包MarsCode:小C的类二进制拼图

问题描述 思路分析 1. 类二进制数字定义 从题目中我们可以知道&#xff0c;类二进制数字是仅由 0 和 1 组成的数字。比如&#xff1a;1, 10, 100, 101, 110 等等&#xff0c;这些数字都是合法的类二进制数字。换句话说&#xff0c;类二进制数字可以看作是 “二进制表示法” 对…

中国综合算力指数(2024年)报告汇总PDF洞察(附原数据表)

原文链接&#xff1a; https://tecdat.cn/?p39061 在全球算力因数字化技术发展而竞争加剧&#xff0c;我国积极推进算力发展并将综合算力作为数字经济核心驱动力的背景下&#xff0c;该报告对我国综合算力进行研究。 中国算力大会发布的《中国综合算力指数&#xff08;2024年…