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渲染视图并返回 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java CRM客户关系管理系统源码:基于Spring Cloud Alibaba与Spring Boot,专为成长型企业设计

项目名称:CRM客户关系管理系统 功能模块及描述: 一、待办事项 今日需联系客户:显示当日需跟进的客户列表,支持查询和筛选。分配给我的线索:管理分配给用户的线索,包括线索列表和查询功能。分配给我的客户…

EDM图纸管理软件_图纸文档管理软件

图纸文档管理软件是一种用于管理和组织各种类型的图纸和文档的工具。它提供了一种集中存储、查找、共享和版本控制图纸和文档的方式,以便团队成员可以更有效地进行协作和管理。 以下是一些常见的图纸文档管理软件: 彩虹EDM系统:这是一款图纸文…

K8S认证|CKA题库+答案| 5. 创建 Ingress

5 . 创建 Ingress 您必须在以下Cluster/Node上完成此考题: Cluster Master node Worker node k8s master …

java项目之图书管理系统源码(springboot+vue+mysql)

风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的图书管理系统。项目源码以及部署相关请联系风歌,文末附上联系信息 。 项目简介: 系统主要分为管理员角色和用…

六种常用设计模式

单例设计模式 单例模式指在整个系统生命周期里,保证一个类只能产生一个实例,确保该类的唯一性。 单例模式分类 单例模式可以分为懒汉式和饿汉式,两者之间的区别在于创建实例的时间不同: 懒汉式:指系统运行中&#…

基于Python实现 HR 分析(逻辑回归和基于树的机器学习)【500010104】

介绍 数据集说明 此数据集包含与员工有关的综合属性集合,从人口统计细节到与工作相关的因素。该分析的主要目的是预测员工流动率并辨别导致员工流失的潜在因素。 在这个数据集中,有14,999行,10列,以及这些变量:满意度…

【Python】 如何使用逗号作为千位分隔符打印数字

基本原理 在Python中,打印数字时自动添加千位分隔符可以提高数字的可读性,尤其是在处理大数字时。Python提供了多种方法来实现这一功能,包括使用内置的format()函数、f-string(格式化字符串字面量)以及locale模块。 …

数据量较小的表是否有必要添加索引问题分析

目录 前言一、分析前准备1.1、准备测试表和数据1.2、插入测试数据1.3、测试环境说明 二、具体业务分析2.1、单次查询耗时分析2.2、无索引并发查询服务器CPU占用率分析2.3、添加索引并发查询服务器CPU占用率分析 三、总结 前言 在一次节日活动我们系统访问量到达了平时的两倍&am…

50道题目!Python、SQL数据库、AB测试、业务分析、机器学习都在这里了!

介绍 每日一题系列已经更新了50道题目啦! 题目难度为初级到中级,涵盖了Python、SQL数据库、AB测试、业务分析、机器学习五大主题,适合初学者和有一定基础的朋友。 原文链接: 50道题目!Python、SQL数据库、AB测试、业务分析、机器…

达梦数据库详解

达梦认证是指针对中国数据库管理系统(DBMS)厂商达梦公司所推出的数据库产品,即达梦数据库(DMDB),进行的一种官方认证体系。达梦认证旨在验证数据库管理人员对达梦数据库产品的掌握程度,及其在数…

LoRA:大型语言模型的低秩适应

LoRA 官网 LoRA(Low-Rank Adaptation)出自2021年的论文“LoRA: Low-Rank Adaptation of Large Language Models” 常见的大模型微调方法: Adapter-Tuning、Prefix-Tuning、Prompt-Tuning(P-Tuning)、P-Tuning v2、LoRA。 LoRA技术冻结预训练…

冬奥会|基于SprinBoot+vue的冬奥会科普平台(源码+数据库+文档)

目录 基于SprinBootvue的冬奥会科普平台 一、前言 二、系统设计 三、系统功能设计 1登录注册 2系统功能模块 3管理员功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取: 博主介绍:✌️大厂码农|…

Discourse 使用 DiscourseConnect 调用接口 admin/users/sync_sso 404 错误

在对用户数据通过 SSO 同步的时候,调用提示 404 错误。 我们使用的是 Java 的代码。 2024-05-23_16-34-421340802 70.3 KB 如上图,返回显示的代码为 404。 问题原因 出现上面错误的原因是安装的 Discourse 实例的 discourse connect 没有启用。 2024-…

【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…

作家百度百科怎么做出来的 怎么创建作家百科词条才能通过

创建作家百度百科词条需要遵循一定的步骤,并注意一些关键点,以确保词条能够顺利通过审核。以下是伯乐网络传媒pouquan根据经验结果得出的详细指导: 准备工作 注册百度账号:在创建任何百度百科词条之前,您需要先注册一…

Milvus的内存索引

简介: 这篇文章主要介绍milvus支持的各种内存索引,以及它们最适用的场景,还有用户为了获得更好的搜索性能可以配置的参数。 索引是有效组织数据的过程,它的主要角色是在大的数据集中显著的加速耗时的查询从而有效的进行相似搜索…

常见的100个Shell命令,超级实用!

在大多数的Linux和Unix系统、及其他类Unix系统中,Shell是用户与操作系统内核交互的主要方式。作为一种强大的命令行解释器,它也支持编程功能,用户可以写脚本来处理各种任务。 熟悉shell脚本,首先要对shell指令熟悉,今…

Python图形界面(GUI)Tkinter笔记(八):用【Label()】方法制作九九乘数表

主要是使用"config()"方法来体现函数式、模块化的美好风景。把需随时要修改的控件参数定义在“config()”方法里且把它封装在一个函数中,这时只需对这函数内的“config()”方法作出相应的修改即可,无需对主代码或全部代码重新修一遍。这也是Py…

【Spring】spring入门程序

案例要求:创建一个 Studentservice 类,其中需要使用 studentDao 接口的保存方法,来存储一个Student 类的对象,StudentDao 接口有两个不同的实现类,通过 Spring 的方式,为 Student类创建对象并为属性赋值&am…

react【框架原理详解】JSX 的本质、SyntheticEvent 合成事件机制、组件渲染过程、组件更新过程

JSX 的本质 JSX 代码本身并不是 HTML,也不是 Javascript,在渲染页面前,需先通过解析工具(如babel)解析之后才能在浏览器中运行。 babel官网可查看 JSX 解析后的效果 更早之前,Babel 会把 JSX 转译成一个 R…