JAVA面试题大全(九)
1、为什么要使用 spring?
- 方便解耦,便于开发
- 支持aop编程
- 声明式事务的支持
- 方便程序的测试
- 方便集成各种优秀的框架
- 降低JavaEE API的使用难度
2、解释一下什么是 aop?
AOP 是 Aspect-Oriented Programming 的缩写,中文翻译为“面向切面编程”。它是一种编程范式,旨在通过将横切关注点与业务逻辑分离,来提高代码的可读性、可维护性和可扩展性。
在传统的编程中,业务逻辑通常与系统的其他关注点(如日志记录、事务管理、权限控制等)紧密耦合在一起。这导致代码变得复杂、难以理解和维护。AOP 提供了一种机制,允许开发人员将这些横切关注点从业务逻辑中分离出来,并将它们封装成独立的模块,称为切面(Aspect)。
切面可以在代码的不同位置插入,例如方法的执行前后、异常处理、对象的创建和销毁等。通过在切面中定义切入点(Pointcut)和通知(Advice),开发人员可以指定在何时何地执行切面的代码。
3、解释一下什么是 ioc?
IOC 是一种设计原则,也是一种架构模式。在传统的编程方式中,对象的创建和管理通常由应用程序代码直接负责。这意味着应用程序需要知道对象的具体类型,并在需要时创建和销毁它们。这种方式存在一些问题,例如对象之间的耦合度较高,难以进行单元测试和维护。
IOC 的核心思想是将对象的创建和管理交给一个容器或框架来处理。容器或框架负责创建对象、管理对象的生命周期、注入对象的依赖关系等。应用程序代码只需要使用容器或框架提供的接口来获取对象,而不需要关心对象的具体创建和管理过程。
通过使用 IOC,对象之间的耦合度降低,应用程序的可测试性和可维护性提高。同时,IOC 也使得应用程序更加灵活,可以方便地替换或扩展对象的实现。
在 Java 中,常见的 IOC 框架有 Spring、Guice 等。这些框架提供了丰富的功能和特性,可以帮助开发人员更方便地实现 IOC。
4、spring 有哪些主要模块?
Spring 是一个开源的轻量级 Java 开发框架,它提供了许多功能模块,帮助开发人员更轻松地构建企业级应用程序。以下是 Spring 框架的主要模块:
- Spring Core:提供了 Spring 框架的核心功能,包括 IoC(控制反转)容器、依赖注入、Bean 管理等。
- Spring Beans:定义了 Bean 的基本概念,包括 Bean 的定义、实例化、生命周期管理等。
- Spring Context:提供了 Spring 框架的上下文环境,包括ApplicationContext 接口、BeanFactory 接口等。
- Spring AOP:提供了面向切面编程的支持,包括切面、切入点、通知等。
- Spring DAO:提供了对数据访问的支持,包括对各种数据库的访问、事务管理等。
- Spring ORM:提供了对对象关系映射(ORM)的支持,包括对 Hibernate、MyBatis 等 ORM 框架的集成。
- Spring Web:提供了对 Web 应用程序的支持,包括 Spring MVC 框架、WebSocket 支持等。
- Spring Security:提供了对安全框架的支持,包括用户认证、授权、加密等。
- Spring Social:提供了对社交网络的支持,包括对 Facebook、Twitter 等社交网络的集成。
- Spring Cloud:提供了对云计算的支持,包括服务发现、负载均衡、配置管理等。
5、spring 常用的注入方式有哪些?
在 Spring 框架中,依赖注入(Dependency Injection,简称 DI)是一种重要的技术,它可以帮助我们管理对象之间的依赖关系。常用的注入方式主要有以下几种:
- 构造函数注入:通过在类的构造函数中传入依赖对象来实现注入。
- Setter 方法注入:通过类中提供的Setter 方法来注入依赖对象。
- 注解注入:通过在类、方法或属性上添加注解来指定依赖关系,Spring 框架会自动进行注入。
以下是对每种注入方式的详细解释:
-
构造函数注入:
- 优点:在对象创建时就完成依赖注入,保证对象的必需依赖不会为
null。 - 缺点:如果类有多个构造函数,可能需要创建多个构造函数来处理不同的依赖注入情况。
- 优点:在对象创建时就完成依赖注入,保证对象的必需依赖不会为
-
Setter 方法注入:
- 优点:Setter 方法的命名通常具有明确的含义,便于理解和维护。
- 缺点:Setter 方法可能会被多次调用,导致不必要的性能开销。
-
注解注入:
- 优点:使用注解可以减少样板代码,提高代码的简洁性和可读性。
- 缺点:如果使用不当,可能会导致代码可读性降低,并且可能会与其他框架或库产生冲突。
在实际开发中,通常会根据具体的需求和项目的特点选择合适的注入方式。同时,Spring 框架还提供了其他注入方式,如接口注入、字段注入等,但这些方式在实际应用中较少使用。
无论使用哪种注入方式,都需要注意以下几点:
- 确保注入的依赖对象是正确的类型和实例。
- 处理好循环依赖的问题,避免出现死循环。
- 合理管理依赖对象的生命周期,确保在需要的时候能够正确创建和销毁。
通过合理使用依赖注入,可以提高代码的可维护性、可扩展性和测试性,使系统更加灵活和易于管理。
6、spring 中的 bean 是线程安全的吗?
在 Spring 框架中,Bean 的作用域决定了 Bean 是否是线程安全的。默认情况下,Spring 的 Bean 是单例模式(Singleton)的,这意味着在整个应用程序中只有一个 Bean 实例存在。由于所有的线程都共享这个单例 Bean,所以如果 Bean 中存在共享的状态(例如成员变量),并且在多线程环境下对这些共享状态进行修改,就可能会出现线程安全问题。
为了确保 Spring Bean 的线程安全,可以采取以下几种措施:
- 使用线程安全的对象:如果 Bean 中包含的成员变量是线程安全的,或者是不可变的(Immutable),那么就不需要担心线程安全问题。例如,使用
String、Integer等基本类型的包装类,或者使用Collections.synchronizedList等线程安全的集合类。 - 避免共享状态:尽量避免在 Bean 中定义共享的状态,尤其是在多线程环境下可能被修改的状态。如果确实需要共享状态,可以考虑使用线程安全的方式来实现,例如使用
Atomic类、Synchronized关键字等。 - 使用多例模式(Prototype):如果 Bean 不需要在整个应用程序中共享,可以将其作用域设置为多例模式(Prototype)。这样,每次获取 Bean 时都会创建一个新的实例,从而避免了线程安全问题。
- 使用线程本地变量(ThreadLocal):如果 Bean 中的状态需要在每个线程中独立存储,可以使用线程本地变量(ThreadLocal)。ThreadLocal 可以为每个线程提供一个独立的变量副本,从而避免了线程安全问题。
- 使用同步机制:如果 Bean 中的方法需要在多线程环境下进行同步操作,可以使用
Synchronized关键字或者Lock类来实现同步。
总之,Spring 中的 Bean 默认情况下不是线程安全的,需要根据具体情况采取相应的措施来确保线程安全。
7、spring 支持几种 bean 的作用域?
- singleton:单例,默认作用域
- prototype:原型,每次创建一个新对象
- request:请求,每次Http请求创建一个新对象,适用于WebApplicationContext环境下
- session:会话,同一个会话共享一个实例,不同会话使用不同的实例
- global-session:全局会话,所有会话共享一个实例
8、spring 事务实现方式有哪些?
- 编程式事务管理,需要在代码中调用beginTransaction()、commit()、rolback()等事务管理相关的方法
- 基于TransactionProxyFactoryBean的声明式事务管理
- 基于@Transactional的声明式事务管理
- 基于Aspectj AOP配置事务
9、说一下 spring 的事务隔离?

10、@RequestMapping 的作用是什么?
@RequestMapping是一个用来处理请求地址映射的注解,可用于类或者方法上,用来标识 http 请求地址与 Controller 类的方法之间的映射。
11、@Autowired 的作用是什么?
@Autowired是一个注解,他可以对类成员变量、方法及构造函数进行标注,让spring完成bean自动装配的工作。
12、说一下 spring mvc 运行流程?
- 用户向服务器发送请求,请求被 Spring 前端控制 Servelt DispatcherServlet 捕获。(捕获)
- DispatcherServlet对请求 URL进行解析,得到请求资源标识符(URI)。然后根据该 URI,调用 HandlerMapping获得该Handler配置的所有相关的对象(包括 Handler对象以及 Handler对象对应的拦截器),最后以 HandlerExecutionChain对象的形式返回;(查找 handler)
- DispatcherServlet 根据获得的 Handler,选择一个合适的 HandlerAdapter。提取Request 中的模型数据,填充 Handler 入参,开始执行 Handler(Controller), Handler执行完成后,向 DispatcherServlet 返回一个 ModelAndView 对象(执行 handler)
- DispatcherServlet 根据返回的 ModelAndView,选择一个适合的 ViewResolver(必须是已经注册到 Spring 容器中的 ViewResolver) (选择 ViewResolver)
- 通过 ViewResolver 结合 Model 和 View,来渲染视图,DispatcherServlet 将渲染结果返回给客户端。(渲染返回)
总结:核心控制器捕获请求、查找Handler、执行Handler、选择ViewResolver,通过ViewResolver渲染视图并返回

相关文章:
JAVA面试题大全(九)
1、为什么要使用 spring? 方便解耦,便于开发支持aop编程声明式事务的支持方便程序的测试方便集成各种优秀的框架降低JavaEE API的使用难度 2、解释一下什么是 aop? AOP 是 Aspect-Oriented Programming 的缩写,中文翻译为“面向…...
React 组件三大核心之 ref
文章目录 用法React.createRef()useRef Hook 注意 ref 是 React 中的一个重要概念,它用于访问和操作 DOM 元素或者类组件实例。 在React中,ref 提供了一种方式,允许我们访问DOM节点或在render方法中创建的React元素。这对于执行DOM操作、读取…...
json 读写 python
目录 这里对json保存做了格式封装 调用代码: python json原始保存是所有json保存一行, 这里对json保存做了格式封装 import numpy as np class MyEncoder(json.JSONEncoder):def default(self, obj):if isinstance(obj, np.integer):return int(obj)…...
Docker快速部署Seata的TC服务以及微服务引入Seata教程
目录 一、使用docker部署Seata的TC服务 1、拉取TC服务镜像 2、创建并运行容器 3、修改配置文件 4、在Nacos中添加TC服务的配置 5、重启TC服务 二、微服务集成Seata 1、引入依赖 2、修改配置文件 Seata是阿里的一个开源的分布式事务解决方案,能够为分布…...
我的第一个JAVA程序IDEA版
目录 第一步 新建一个空项目第二步 新建模块第三步 新建包第四步 新建类第五步 新建main方法 第一步 新建一个空项目 第二步 新建模块 第三步 新建包 第四步 新建类 然后在包文件夹下新建类 第五步 新建main方法...
轻量SEO分析报告程序网站已开心去授权
轻量SEO分析报告程序网站已开心去授权,可以让你生成有洞察力的、 简洁的、易于理解的SEO报告,帮助你的网页排名和表现更好 网站源码免费下载地址抄笔记 (chaobiji.cn)https://chaobiji.cn/...
本机与华为云ping不通的问题
进入华为云控制台。依次选择:云服务器->点击服务器id->安全组->更改安全组->添加入方向规则,添加一个安全组规则(ICMP),详见下图 再次ping公网ip就可以ping通了 产生这一问题的原因是ping的协议基于ICMP…...
FastJSON2 > FastJSON 好在何处
FastJSON 是一种广泛使用的 JSON 解析库,其高性能和简单易用的特点受到开发者的喜爱。然而,随着应用场景的复杂化和安全要求的提高,FastJSON 逐渐暴露出一些问题。为了解决这些问题并进一步提升性能和安全性,阿里巴巴推出了 FastJ…...
7个常见的SQL慢查询问题及其解决方法
大家好,得益于摩尔定律,计算机性能已大幅提升,加上数据库的进步以及微服务所倡导的各种反模式设计,因此现在编写复杂SQL查询的机会越来越少。业界已经开始提倡不要进行专门的SQL优化,因为节省下来的资源并不足以抵消员…...
《Rust奇幻之旅:从Java和C++开启》第1章Hello world 1/5
讲动人的故事,写懂人的代码 很多程序员都在自学Rust。 🤕但Rust的学习曲线是真的陡,让人有点儿怵头。 程序员工作压力大,能用来自学新东西的时间简直就是凤毛麟角。 📕目前,在豆瓣上有7本Rust入门同类书。它们虽有高分评价,但仍存在不足。 首先,就是它们介绍的Rust新…...
将富文本编辑器中的H标签处理成树形结构,支持无限层级
做富文本编辑器时,需要将文本里的标题整理成树形数据, // 这里是数据结构 const data [{"id": "hkyrq2ndc-36yttda0lme00","text": "阿萨德阿萨德阿萨","level": 1,"depth": 1,},{"…...
探索移动云:我的ES与Kibana之旅
目录 引言: 如何免费体验移动云产品 登录并完成实名认证 选择试用ECS云主机 安全组配置 安装Elasticsearch和Kibana 安装Elasticsearch 编辑安装kibana 测试结果 使用感觉 引言: 移动云技术产品的发展已经取得了巨大的进步。云数融合、A1、大…...
java 线程执行原理,java线程在jvm中执行流程
java 线程执行原理,java线程在jvm中执行流程 从jvm视角看java线程执行过程 ##首先thread.c注册jni函数 JNIEXPORT void JNICALL Java_java_lang_Thread_registerNatives(JNIEnv *env, jclass cls) {(*env)->RegisterNatives(env, cls, methods, ARRAY_LENGTH(…...
[Redis]基本全局命令
Redis存储方式介绍 在 Redis 中数据是以键值对的凡事存储的,键(Key)和值(Value)是基本的数据存储单元。以下是对 Redis 键值对的详细讲解: 键(Key): 类型:…...
【Linux】- HBase集群部署 [19]
简介 apache HBase是一种分布式、可扩展、支持海量数据存储的 NoSQL 数据库。 和Redis一样,HBase是一款KeyValue型存储的数据库。 不过和Redis涉及方向不同 Redis设计为少量数据,超快检索HBase设计为海量数据,快速检索 HBase在大数据邻域…...
js如何遍历FormData的值
遍历FormData的值,一般有2种方法:forEach 和 for...of entries const data new FormData();data.append(aaa, 111); data.append(bbb, 222);// 方法1 data.forEach((value, key) > {console.log(key, value); }) 输出 aaa 111 和 bbb 222// 方法2 …...
【C语言】明析部分C语言内存函数
目录 1.memcpy 2.memmove 3.memset 4.memcmp 以下都是内存函数,作用单位均是字节 1.memcpy memcpy是C/C语言中的一个内存拷贝函数,其原型为: void* memcpy(void* dest, const void* src, size_t n);目标空间(字节)…...
一阶数字高通滤波器
本文的主要内容包含一阶高通滤波器公式的推导和数字算法的实现以及编程和仿真 1 计算公式推导 1.1.2 算法实现及仿真 利用python实现的代码如下: import numpy as np # from scipy.signal import butter, lfilter, freqz import matplotlib.pyplot as plt #2pifW…...
Linux多线程系列2: 模拟封装简易语言级线程库,线程互斥和锁,线程同步和条件变量,线程其他知识点
Linux多线程系列2: 模拟封装简易语言级线程库,线程互斥和互斥锁,线程同步和条件变量,线程其他知识点 1.前言 一.模拟C11线程库自己封装简易语言级线程库1.实现框架2.迅速把构造等等函数写完3.start和work1.尝试一2.尝试二3.最终版本4.给出代码 二.模拟实现多线程(为编写线程池做…...
VUE3-form表单保存附件与基本信息
element-ui代码 <el-dialog :title"上传附件" v-model"dialogAdds.visible" width"500px" append-to-body> <el-form-item label"唯一标识"> <dict-tag v-if"form.groupId" :options"unique_identifica…...
Vue记事本应用实现教程
文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...
stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...
linux 错误码总结
1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...
k8s业务程序联调工具-KtConnect
概述 原理 工具作用是建立了一个从本地到集群的单向VPN,根据VPN原理,打通两个内网必然需要借助一个公共中继节点,ktconnect工具巧妙的利用k8s原生的portforward能力,简化了建立连接的过程,apiserver间接起到了中继节…...
深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南
🚀 C extern 关键字深度解析:跨文件编程的终极指南 📅 更新时间:2025年6月5日 🏷️ 标签:C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言🔥一、extern 是什么?&…...
实现弹窗随键盘上移居中
实现弹窗随键盘上移的核心思路 在Android中,可以通过监听键盘的显示和隐藏事件,动态调整弹窗的位置。关键点在于获取键盘高度,并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...
根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:
根据万维钢精英日课6的内容,使用AI(2025)可以参考以下方法: 四个洞见 模型已经比人聪明:以ChatGPT o3为代表的AI非常强大,能运用高级理论解释道理、引用最新学术论文,生成对顶尖科学家都有用的…...
AI书签管理工具开发全记录(十九):嵌入资源处理
1.前言 📝 在上一篇文章中,我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源,方便后续将资源打包到一个可执行文件中。 2.embed介绍 🎯 Go 1.16 引入了革命性的 embed 包,彻底改变了静态资源管理的…...
Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)
目录 一、👋🏻前言 二、😈sinx波动的基本原理 三、😈波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、🌊波动优化…...
