当前位置: 首页 > news >正文

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 框架的主要模块:

  1. Spring Core:提供了 Spring 框架的核心功能,包括 IoC(控制反转)容器、依赖注入、Bean 管理等。
  2. Spring Beans:定义了 Bean 的基本概念,包括 Bean 的定义、实例化、生命周期管理等。
  3. Spring Context:提供了 Spring 框架的上下文环境,包括ApplicationContext 接口、BeanFactory 接口等。
  4. Spring AOP:提供了面向切面编程的支持,包括切面、切入点、通知等。
  5. Spring DAO:提供了对数据访问的支持,包括对各种数据库的访问、事务管理等。
  6. Spring ORM:提供了对对象关系映射(ORM)的支持,包括对 Hibernate、MyBatis 等 ORM 框架的集成。
  7. Spring Web:提供了对 Web 应用程序的支持,包括 Spring MVC 框架、WebSocket 支持等。
  8. Spring Security:提供了对安全框架的支持,包括用户认证、授权、加密等。
  9. Spring Social:提供了对社交网络的支持,包括对 Facebook、Twitter 等社交网络的集成。
  10. Spring Cloud:提供了对云计算的支持,包括服务发现、负载均衡、配置管理等。

5、spring 常用的注入方式有哪些? 

在 Spring 框架中,依赖注入(Dependency Injection,简称 DI)是一种重要的技术,它可以帮助我们管理对象之间的依赖关系。常用的注入方式主要有以下几种:

  1. 构造函数注入:通过在类的构造函数中传入依赖对象来实现注入。
  2. Setter 方法注入:通过类中提供的Setter 方法来注入依赖对象。
  3. 注解注入:通过在类、方法或属性上添加注解来指定依赖关系,Spring 框架会自动进行注入。

以下是对每种注入方式的详细解释:

  1. 构造函数注入

    • 优点:在对象创建时就完成依赖注入,保证对象的必需依赖不会为null
    • 缺点:如果类有多个构造函数,可能需要创建多个构造函数来处理不同的依赖注入情况。
  2. Setter 方法注入

    • 优点:Setter 方法的命名通常具有明确的含义,便于理解和维护。
    • 缺点:Setter 方法可能会被多次调用,导致不必要的性能开销。
  3. 注解注入

    • 优点:使用注解可以减少样板代码,提高代码的简洁性和可读性。
    • 缺点:如果使用不当,可能会导致代码可读性降低,并且可能会与其他框架或库产生冲突。

在实际开发中,通常会根据具体的需求和项目的特点选择合适的注入方式。同时,Spring 框架还提供了其他注入方式,如接口注入、字段注入等,但这些方式在实际应用中较少使用。

无论使用哪种注入方式,都需要注意以下几点:

  1. 确保注入的依赖对象是正确的类型和实例。
  2. 处理好循环依赖的问题,避免出现死循环。
  3. 合理管理依赖对象的生命周期,确保在需要的时候能够正确创建和销毁。

通过合理使用依赖注入,可以提高代码的可维护性、可扩展性和测试性,使系统更加灵活和易于管理。

6、spring 中的 bean 是线程安全的吗?

在 Spring 框架中,Bean 的作用域决定了 Bean 是否是线程安全的。默认情况下,Spring 的 Bean 是单例模式(Singleton)的,这意味着在整个应用程序中只有一个 Bean 实例存在。由于所有的线程都共享这个单例 Bean,所以如果 Bean 中存在共享的状态(例如成员变量),并且在多线程环境下对这些共享状态进行修改,就可能会出现线程安全问题。

为了确保 Spring Bean 的线程安全,可以采取以下几种措施:

  1. 使用线程安全的对象:如果 Bean 中包含的成员变量是线程安全的,或者是不可变的(Immutable),那么就不需要担心线程安全问题。例如,使用StringInteger等基本类型的包装类,或者使用Collections.synchronizedList等线程安全的集合类。
  2. 避免共享状态:尽量避免在 Bean 中定义共享的状态,尤其是在多线程环境下可能被修改的状态。如果确实需要共享状态,可以考虑使用线程安全的方式来实现,例如使用Atomic类、Synchronized关键字等。
  3. 使用多例模式(Prototype):如果 Bean 不需要在整个应用程序中共享,可以将其作用域设置为多例模式(Prototype)。这样,每次获取 Bean 时都会创建一个新的实例,从而避免了线程安全问题。
  4. 使用线程本地变量(ThreadLocal):如果 Bean 中的状态需要在每个线程中独立存储,可以使用线程本地变量(ThreadLocal)。ThreadLocal 可以为每个线程提供一个独立的变量副本,从而避免了线程安全问题。
  5. 使用同步机制:如果 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);目标空间(字节&#xff09…...

一阶数字高通滤波器

本文的主要内容包含一阶高通滤波器公式的推导和数字算法的实现以及编程和仿真 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…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻

在如今就业市场竞争日益激烈的背景下&#xff0c;越来越多的求职者将目光投向了日本及中日双语岗位。但是&#xff0c;一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧&#xff1f;面对生疏的日语交流环境&#xff0c;即便提前恶补了…...

Vue记事本应用实现教程

文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展&#xff1a;显示创建时间8. 功能扩展&#xff1a;记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...

大话软工笔记—需求分析概述

需求分析&#xff0c;就是要对需求调研收集到的资料信息逐个地进行拆分、研究&#xff0c;从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要&#xff0c;后续设计的依据主要来自于需求分析的成果&#xff0c;包括: 项目的目的…...

ubuntu搭建nfs服务centos挂载访问

在Ubuntu上设置NFS服务器 在Ubuntu上&#xff0c;你可以使用apt包管理器来安装NFS服务器。打开终端并运行&#xff1a; sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享&#xff0c;例如/shared&#xff1a; sudo mkdir /shared sud…...

【Linux】C语言执行shell指令

在C语言中执行Shell指令 在C语言中&#xff0c;有几种方法可以执行Shell指令&#xff1a; 1. 使用system()函数 这是最简单的方法&#xff0c;包含在stdlib.h头文件中&#xff1a; #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...

多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验

一、多模态商品数据接口的技术架构 &#xff08;一&#xff09;多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如&#xff0c;当用户上传一张“蓝色连衣裙”的图片时&#xff0c;接口可自动提取图像中的颜色&#xff08;RGB值&…...

将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?

Otsu 是一种自动阈值化方法&#xff0c;用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理&#xff0c;能够自动确定一个阈值&#xff0c;将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...

【Go】3、Go语言进阶与依赖管理

前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课&#xff0c;做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程&#xff0c;它的核心机制是 Goroutine 协程、Channel 通道&#xff0c;并基于CSP&#xff08;Communicating Sequential Processes&#xff0…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)

本文把滑坡位移序列拆开、筛优质因子&#xff0c;再用 CNN-BiLSTM-Attention 来动态预测每个子序列&#xff0c;最后重构出总位移&#xff0c;预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵&#xff08;S…...

初学 pytest 记录

安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...