Spring面试题

2023-10-27

1.Spring是什么?

1.Spring是⼀个轻量级的控制反转和⾯向切⾯的容器框架:
2.通过控制反转(IoC)的技术达到松耦合的⽬的
3.包含并管理应⽤对象(Bean)的配置和⽣命周期,这个意义上是⼀个容器。
4.可以整合多种技术

2.谈谈你对AOP的理解

OOP允许我们定义从上到下的关系,导致了⼤量代码的重复,⽽不利于各个模块的重⽤。
AOP将程序中的交叉业务逻辑,封装成⼀个切⾯,然后注⼊到⽬标对象的具体业务逻辑中去。AOP可以对某个对象或某些对象的功能进⾏增强。

3.谈谈你对IOC的理解

容器概念、控制反转、依赖注⼊

ioc容器:实际上就是个map,⾥⾯存的是各种对象。在项⽬启动的时候会读取配置⽂件⾥⾯的 bean节点,根据全限定类名使⽤反射创建对象放到map⾥。接下来我们在代码⾥需要⽤到⾥⾯的对象时再通过注入获取。

控制反转
在没有引⼊IOC容器之前,对象A依赖于对象B,那么对象A运⾏到某⼀点的时候,⾃⼰必须主动去创建对象B,进行对对象B的控制。
引⼊IOC容器之后,对象A与对象B之间失去了直接联系,全部对象的控制权全部上缴给“第三⽅”IOC容器,它起到了 ⼀种类似“粘合剂”的作⽤,这就是控制反转。

4.解释下Spring⽀持的⼏种bean的作⽤域。

● singleton:默认,每个容器中只有⼀个bean的实例。该对象的⽣命周期是与Spring IOC容器⼀致的(但在第⼀次被注⼊时才会创建)。

● prototype:为每⼀个bean请求提供⼀个实例。在每次注⼊时都会创建⼀个新的对象

● request:bean被定义为在每个HTTP请求中创建⼀个单例对象,也就是说在单个请求中都会复⽤这⼀个单例对象。

● session:与request范围类似,确保每个session中有⼀个bean的实例,在session过期后,bean会随之失效。

5.Spring事务隔离级别?

spring事务隔离级别就是数据库的隔离级别:
read uncommitted(未提交读)
read committed(提交读、不可重复读)
repeatable read(可重复读)
serializable(可串⾏化)

数据库的配置隔离级别是Read Commited,⽽Spring配置的隔离级别是Repeatable Read,请问这时隔离级别是以哪⼀个为准? 以Spring配置的为准,如果spring设置的隔离级别数据库不⽀持,效果取决于数据库

6.Spring事务传播机制

  1. REQUIRED(Spring默认的事务传播类型):如果当前没有事务,则⾃⼰新建⼀个事务,如果当前存 在事务,则加⼊这个事务
  2. SUPPORTS:当前存在事务,则加⼊当前事务,如果当前没有事务,就以⾮事务⽅法执⾏
  3. MANDATORY:当前存在事务,则加⼊当前事务,如果当前事务不存在,则抛出异常。
  4. REQUIRES_NEW:创建⼀个新事务,如果存在当前事务,则挂起该事务。
  5. NOT_SUPPORTED:以⾮事务⽅式执⾏,如果当前存在事务,则挂起当前事务
  6. NEVER:不使⽤事务,如果当前事务存在,则抛出异常
  7. NESTED:如果当前事务存在,则在嵌套事务中执⾏,否则REQUIRED的操作⼀样(开启⼀个事 务)

7.Spring事务什么时候会失效?

1、发⽣⾃调⽤,不是通过注入的Bean对象调用,而是通过普通对象调用事务方法。
2、⽅法不是public的:@Transactional 只能⽤于 public 的⽅法上,否则事务不会失效,如果要⽤在⾮ public ⽅法上,可以开启 AspectJ 代理模式。
3、数据库不⽀持事务
4、没有被spring管理
5、异常被吃掉,事务不会回滚(或者抛出的异常没有被定义,默认为RuntimeException)

8.Spring中的Bean创建的⽣命周期有哪些步骤

在这里插入图片描述

  1. 推断构造⽅法
  2. 实例化
  3. 填充属性,也就是依赖注⼊
  4. 处理Aware回调
  5. 初始化前,处理@PostConstruct注解
  6. 初始化,处理InitializingBean接⼝
  7. 初始化后,进⾏AOP
    https://blog.csdn.net/weixin_45994575/article/details/120254342

9.Spring中Bean是线程安全的吗

1.Spring中的Bean默认是单例模式的,框架并没有对bean进行多线程的封装处理。 如果Bean是⽆状态的,那么Bean则是线程安全的
2. 有状态的bean,具有数据存储功能。无状态的bean,只有普通的对数据的操作方法,而没有存储功能。有状态的bean不应该被线程共享,无状态的bean可以被线程共享。如果Bean是有状态的,那么Bean则不是线程安全的 。如果Bean是有状态的 那就需要开发人员自己来进行线程安全的保证,最简单的办法就是改变bean的作用域 把 "singleton"改为’‘protopyte’ 这样每次请求Bean就相当于是 new Bean() 这样就可以保证线程的安全了。

10.ApplicationContext和BeanFactory有什么区别

BeanFactory:

是Spring里面最低层的接口,提供了最简单的容器的功能,提供了实例化对象和获取对象的功能;

ApplicationContext:

应用上下文,继承BeanFactory接口,它是Spring的一个更高级的容器,提供了更多的有用的功能;比如:

国际化(MessageSource)

访问资源,如URL和文件(ResourceLoader)

载入多个(有继承关系)上下文 ,使得每一个上下文都专注于一个特定的层次,比如应用的web层

消息发送、响应机制(ApplicationEventPublisher)

AOP(拦截器)

BeanFactory在启动的时候不会去实例化Bean,只有中有从容器中拿Bean的时候才会去实例化;

ApplicationContext在启动的时候就把所有的Bean全部实例化了。

11.Spring中的事务是如何实现的

  1. Spring事务底层是基于数据库事务和AOP机制的
  2. ⾸先对于使⽤了@Transactional注解的Bean,Spring会创建⼀个代理对象作为Bean
  3. 当调⽤代理对象的⽅法时,会先判断该⽅法上是否加了@Transactional注解
  4. 如果加了,那么则利⽤事务管理器创建⼀个数据库连接
  5. 并且修改数据库连接的autocommit属性为false,禁⽌此连接的⾃动提交
  6. 然后执⾏当前⽅法,⽅法中会执⾏sql
  7. 执⾏完当前⽅法后,如果没有出现异常就直接提交事务
  8. 如果出现了异常,并且这个异常是需要回滚的就会回滚事务,否则仍然提交事务

13.Spring容器启动流程是怎样的

  1. 在创建Spring容器,也就是启动Spring时:

  2. ⾸先会进⾏扫描,扫描得到所有的BeanDefinition对象,并存在⼀个Map中

  3. 然后筛选出⾮懒加载的单例BeanDefinition进⾏创建Bean,对于多例Bean不需要在启动过程中去进⾏创建,对于多例Bean会在每次获取Bean时利⽤BeanDefinition去创建

  4. 利⽤BeanDefinition创建Bean就是Bean的创建⽣命周期,这期间包括了合并BeanDefinition、推断 构造⽅法、实例化、属性填充、初始化前、初始化、初始化后等步骤,其中AOP就是发⽣在初始化 后这⼀步骤中

  5. 单例Bean创建完了之后,Spring会发布⼀个容器启动事件

  6. Spring启动结束

  7. 在源码中会更复杂,⽐如源码中会提供⼀些模板⽅法,让⼦类来实现,⽐如源码中还涉及到⼀些 BeanFactoryPostProcessor和BeanPostProcessor的注册,Spring的扫描就是通过 BenaFactoryPostProcessor来实现的,依赖注⼊就是通过BeanPostProcessor来实现的

  8. 在Spring启动过程中还会去处理@Import等注解

14.Spring Boot、Spring MVC 和 Spring 有什么区别

spring是⼀个IOC容器,⽤来管理Bean,使⽤依赖注⼊实现控制反转,可以很⽅便的整合各种框架

springmvc是spring对web框架的⼀个解决⽅案,提供了⼀个总的前端控制器Servlet⽤来接收请求, 然后定义了⼀套路由策略将结果使⽤视图解析技术⽣成视图展现给前端

springboot是spring提供的⼀个快速开发⼯具包,让程序员能更⽅便、更快速的开发spring+springmvc 应⽤,约定了默认配置,整合了⼀系列的解决⽅案,可以开箱即⽤

15.Spring MVC ⼯作流程

1)⽤户发送请求⾄前端控制器 DispatcherServlet。
2)DispatcherServlet 收到请求调⽤ HandlerMapping 处理器映射器。
3)处理器映射器找到具体的处理器,⽣成处理器及处理器拦截器⼀并返回给 DispatcherServlet
4)DispatcherServlet 调⽤ HandlerAdapter 处理器适配器。
5)HandlerAdapter 经过适配调⽤后端控制器
6)Controller 执⾏完成返回 ModelAndView。
7)HandlerAdapter 将 controller 执⾏结果 ModelAndView 返回给 DispatcherServlet。
8) DispatcherServlet 将 ModelAndView 传给 ViewReslover 视图解析器。
9)ViewReslover 解析后返回具体 View。
10)DispatcherServlet 根据 View 进⾏渲染视图
11)DispatcherServlet 响应⽤户。

17.Spring Boot ⾃动配置原理?

@Import + @Configuration + Spring spi ⾃动配置类由各个starter提供,使⽤@Configuration + @Bean定义配置类,放到META- INF/spring.factories下 使⽤Spring spi扫描META-INF/spring.factories下的配置类 使⽤@Import导⼊⾃动配置类

18.如何理解 Spring Boot 中的 Starter

使⽤spring + springmvc使⽤,如果需要引⼊mybatis等框架,需要到xml中定义mybatis需要的bean starter就是定义⼀个starter的jar包,写⼀个@Configuration配置类、将这些bean定义在⾥⾯,然后在 starter包的META-INF/spring.factories中写⼊该配置类,springboot会按照约定来加载该配置类
开发⼈员只需要将相应的starter包依赖进应⽤,进⾏相应的属性配置(使⽤默认配置时,不需要配 置),就可以直接进⾏代码开发,使⽤对应的功能了,⽐如mybatis-spring-boot–starter,spring- boot-starter-redis

19.Spring Boot中常⽤注解及其底层实现

  1. @SpringBootApplication注解:这个注解标识了⼀个SpringBoot⼯程,它实际上是另外三个注解的 组合,这三个注解是: a. @SpringBootConfiguration:这个注解实际就是⼀个@Configuration,表示启动类也是⼀个 配置类 b. @EnableAutoConfiguration:向Spring容器中导⼊了⼀个Selector,⽤来加载ClassPath下 SpringFactories中所定义的⾃动配置类,将这些⾃动加载为配置Bean c. @ComponentScan:标识扫描路径,因为默认是没有配置实际扫描路径,所以SpringBoot扫 描的路径是启动类所在的当前⽬录

  2. @Bean注解:⽤来定义Bean,类似于XML中的标签,Spring在启动时,会对加了@Bean注 解的⽅法进⾏解析,将⽅法的名字做为beanName,并通过执⾏⽅法得到bean对象

  3. @Controller、@Service、@ResponseBody、@Autowired都可以说

20.Spring Boot是如何启动Tomcat的

  1. ⾸先,SpringBoot在启动时会先创建⼀个Spring容器
  2. 在创建Spring容器过程中,会利⽤@ConditionalOnClass技术来判断当前classpath中是否存在 Tomcat依赖,如果存在则会⽣成⼀个启动Tomcat的Bean
  3. Spring容器创建完之后,就会获取启动Tomcat的Bean,并创建Tomcat对象,并绑定端⼝等,然后 启动Tomcat

21.Spring Boot中配置⽂件的加载顺序是怎样的?

优先级从⾼到低,⾼优先级的配置覆盖低优先级的配置,所有配置会形成互补配置。

  1. 命令⾏参数。所有的配置都可以在命令⾏上进⾏指定;
  2. Java系统属性(System.getProperties());
  3. 操作系统环境变量 ;
  4. jar包外部的application-{profile}.properties或application.yml(带spring.profile)配置⽂件
  5. jar包内部的application-{profile}.properties或application.yml(带spring.profile)配置⽂件 再来加 载不带profile
  6. jar包外部的application.properties或application.yml(不带spring.profile)配置⽂件
    . jar包内部的application.properties或application.yml(不带spring.profile)配置⽂件
  7. @Configuration注解类上的@PropertySource
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring面试题 的相关文章

  • 当路径的点超出视野时,Android Canvas 不会绘制路径

    我在绘制路径时遇到了 Android Canvas 的一些问题 我的情况是 我有一个相对布局工作 如地图视图 不使用 google api 或类似的东西 我必须在该视图上绘制一条路径 canvas drawPath polyPath bor
  • (Java) App Engine 中的静态文件无法访问

    The 示例文档 http code google com appengine docs java gettingstarted staticfiles html表示您只需将文件放在 war 或子目录 中 并且应该可以从主机访问它们 只要它
  • HAProxy SSL终止+客户端证书验证+curl/java客户端

    我希望使用我自己的自签名证书在 HAProxy 上进行 SSL 终止 并使用我创建的客户端证书验证客户端访问 我通过以下方式创建服务器 也是 CA 证书 openssl genrsa out ca key 1024 openssl req
  • 文本在指定长度后分割,但不要使用 grails 打断单词

    我有一个长字符串 需要将其解析为长度不超过 50 个字符的字符串数组 对我来说 棘手的部分是确保正则表达式找到 50 个字符之前的最后一个空格 以便在字符串之间进行彻底的分隔 因为我不希望单词被切断 public List
  • 在 Struts 2 中传递 URL 参数而不使用查询字符串

    我想使用类似的 URL host ActionName 123 abc 而不是像这样传递查询字符串 host ActionName parm1 123 parm2 abc 我怎样才能在 Struts 2 中做到这一点 我按照下面的方法做了
  • FileNotFoundException - Struts2 文件上传

    Strange FileNotFoundException使用Struts2上传文件时 这是 JSP 的一部分
  • 为自定义驱动程序创建 GraphicsDevice

    我正在开发一个在嵌入式系统中使用 Java 的项目 我有用于屏幕和触摸输入的驱动程序 以及用于文本输入的虚拟键盘 我的屏幕驱动程序有一个Graphics2D您可以绘制的对象和repaint Rectangle 更新方法 类似地 触摸驱动器能
  • Java中的断点和逐步调试?

    抱歉我的问题名称很奇怪 我不知道如何寻找这个 因为我不知道这些东西是如何称呼的 Visual Studio 中至少有一个功能 您可以单击代码左侧并设置一个大红点的起点 然后运行程序 您可以通过按 f8 或 f5 实际上是不同的 f 来跟踪步
  • 当 minifyEnabled 为 true 时 Android 应用程序崩溃

    我正在使用多模块应用程序 并且该应用程序崩溃时minifyEnabled true in the installed模块的build gradle 以下是从游戏控制台检索到的反混淆堆栈跟踪 FATAL EXCEPTION Controlle
  • Spring Batch:一个读取器、多个处理器和写入器

    在 Spring 批处理中 我需要将 ItemReader 读取的项目传递给两个不同的处理器和编写器 我想要实现的是 gt ItemProcessor 1 gt ItemWriter 1 ItemReader gt item gt Item
  • 在 Java 中通过 XSLT 分解 XML

    我需要转换具有嵌套 分层 表单结构的大型 XML 文件
  • 用于缓存的 Servlet 过滤器

    我正在创建一个用于缓存的 servlet 过滤器 这个想法是将响应主体缓存到memcached 响应正文由以下方式生成 结果是一个字符串 response getWriter print result 我的问题是 由于响应正文将不加修改地放
  • Spring Data JPA:查询如何返回非实体对象或对象列表?

    我在我的项目中使用 Spring Data JPA 我正在演奏数百万张唱片 我有一个要求 我必须获取各种表的数据并构建一个对象 然后将其绘制在 UI 上 现在如何实现我的 Spring 数据存储库 我读到它可以通过命名本机查询来实现 如果指
  • 在 Clojure 中解压缩 zlib 流

    我有一个二进制文件 其内容由zlib compress在Python上 有没有一种简单的方法可以在Clojure中打开和解压缩它 import zlib import json with open data json zlib wb as
  • 无法在 Java/Apache HttpClient 中处理带有垂直/管道栏的 url

    例如 如果我想处理这个网址 post new HttpPost http testurl com lists lprocess action LoadList 401814 1 Java Apache 不允许我这么做 因为它说竖线 是非法的
  • JAVA中遍历JSON数据

    我是 JSON 新手 我使用 HTTPUrlConnections 并在 JAVA 程序中获得一些响应 响应数据将类似于 data id 1 userId 1 name ABC modified 2014 12 04 created 201
  • 我可以限制分布式应用程序发出的请求吗?

    我的应用程序发出 Web 服务请求 提供商处理的请求有最大速率 因此我需要限制它们 当应用程序在单个服务器上运行时 我曾经在应用程序级别执行此操作 一个对象跟踪到目前为止已发出的请求数量 并在当前请求超出允许的最大负载时等待 现在 我们正在
  • ECDH使用Android KeyStore生成私钥

    我正在尝试使用 Android KeyStore Provider 生成的私有文件在 Android 中实现 ECDH public byte ecdh PublicKey otherPubKey throws Exception try
  • HttpClient请求设置属性问题

    我使用这个 HttpClient 库玩了一段时间 几周 我想以某种方式将属性设置为请求 不是参数而是属性 在我的 servlet 中 我想使用 Integer inte Integer request getAttribute obj 我不
  • 如何使用通配符模拟泛型方法的行为

    我正在使用 EasyMock 3 2 我想基于 Spring Security 为我的部分安全系统编写一个测试 我想嘲笑Authentication http docs spring io autorepo docs spring secu

随机推荐

  • 【整理贴】截至2023.01.02 博主都写了哪些内容?

    博主虽然参加csdn已经四个年头了 开始创作其实是从21年9月确定了直博才开始的 由于是跨专业 很多基本知识都不牢固 总是忘记 这个锅还是不要给脑雾了 如果每次想用的时候能非常方便的复习就好了 而且通过整理也会知道哪里我原本是会的 还有哪里
  • 多通道图片的卷积

    一 多通道 channels 图片的卷积 网上很多资料都是单通道的卷积 很容易理解 但多通道的卷积更普遍 理解较复杂 需要单独提一下 彩色图像 一般都是RGB三个通道 channel 的 因此输入数据的维度一般有三个 长 宽 通道 比如一个
  • echars图表一进来默认显示tooltip

    写在前面 项目中碰到一个小优化项 echarts图表渲染一进来默认显示指定标记点信息窗即tooltip 效果类似 动手实现 核心是利用chart实例的dispatchAction方法 部分代码示例 注 vue环境
  • Java 进阶二知识--重拾者AIMING

    初级选手 Java 基础知识 重拾者AIMING Aimin20210819 公号 进阶一选手 Java 进阶一知识 重拾者AIMING Aimin20210819 公号 目录 1 参数数组和参数列表 重复使用参数 2 Java深浅拷贝
  • R语言常用数据管理

    1 变量的重命名 1 交互式编辑器修改变量名 若要修改数据集x中的变量名 键入fix x 即可打开交互式编辑器的界面 若数据集为矩阵或数据框 单击交互式编辑器界面中对应要修改的变量名 可手动输入新的变量名 若数据集为列表 则交互式编辑界面为
  • JSP原理

    1 什么是JSP Java Server Page Java服务器端页面 也和Servlet一样 用于动态Web技术 最大的特点 写JSP就像再写HTML 页面生成了java JSP本质上就是servlet 3 输出页面前增加的代码 1 r
  • ERROR: Cannot uninstall ‘wrapt‘. It is a distutils installed project and thus we cannot accurately..

    1 问题描述 pip install tensorflow 报错 ERROR Cannot uninstall wrapt It is a distutils installed project and thus we cannot acc
  • 什么是管理能力,管理者的品格有哪些

    走上管理岗位要明白 到底什么是管理能力 1 解决问题的能力 管理者必须面对许多难以解决的 甚至十分不明确的问题 但是只要采用合 适的方法 几乎所有的问题都能成功解决 2 沟通协调的能力 管理者在日常工作中妥善处理好上级 同级 下级等各种关系
  • IDEA产生及相应的应用

    思考 在用记事本编写程序代码的过程中 需要配合使用各种命令在控制台调控编译 给我们的实际操作带来了不小的工作量 如果初学者不能够调整好心态一步步操作 很容易放弃 如何能够让初学者和开发者用起来更方便快捷呢 深度的思考就会有创新 由此一个新的
  • 区块链开发指南_区块链软件开发详解

    开发业务层区块链应用 Hyperledger fabric目前支持java nodejs go和python语言的sdk 供用户选择用不同的语言开发上层应用 使用相应的sdk调用部署在区块链上的链码 以下示例中我们选择使用go语言开发业务层
  • 《Python》计算机视觉编程

    基本的图像操作处理 PIL 目前pycharm使用的是pillow库 from PIL import Image pil im Image open empire jpg 上述代码的返回值pil im是一个PIL图像对象 图像的颜色转换可以
  • Cisco模拟器-ospf配置实验(验证与负载均衡)

    要求 如图运行OSPF区域 区域1要求用OSPF明文验证 区域0要求用可靠的验证方式 要求R4去往R1的环回从R2走 R1上看到去往R4的两条等价负载均衡 基础配置 R1 R1 config int f0 0 R1 config if ip
  • django2.x/3.x 前端页面在debug模式中找不到动态文件static

    修改setting配置 STATIC URL static STATICFILES DIRS os path join BASE DIR static html页面中 load static bootstrap bootstrap min
  • objdump说明

    objdump有点象那个快速查看之流的工具 就是以一种可阅读的格式让你更多地了解二进制文件可能带有的附加信息 使用objdump显示vxWorks的文件头信息以及入口地址例子 D ftproot gt C Tornado2 2Arm hos
  • css文本超出容器宽度自动换行及超过行数加省略号...

    css文本超过div的宽度时 让它进行自动换行 并且超过div高度时候 在最后一行加省略号 废话不多说 上代码 display webkit box overflow hidden text overflow ellipsis word w
  • 基站分布图,通过基站定位数据来看google基站数据分布

    原文地址 http hi baidu com ant mobile blog item 6d619b11042fd2f7c2ce7950 html 无论是应用更广泛的gps定位 还是基站定位 Wi Fi定位 都需要依托于强大精确的地图 而g
  • STM32CubeIDE使用笔记(02):STM32CubeMX配置与代码生成

    文章目录 目的 用户界面 引脚输出和配置 时钟配置 项目管理 工具 代码生成 更换芯片 总结 目的 STM32CubeIDE中整合了STM32CubeMX用来配置芯片资源生成初始化代码 本篇将介绍STM32CubeMX使用方法 用户界面 界
  • pycharm如何打开历史_分享Pycharm中一些不为人知的技巧

    工欲善其事必先利其器 Pycharm 是最受欢迎的Python开发工具 它提供的功能非常强大 是构建大型项目的理想工具之一 如果能挖掘出里面实用技巧 能带来事半功倍的效果 以下操作都是基于 Windows 平台下的默认KeyMap设置 在
  • MongoDB局域网访问

    在安装目录下的配置文件中修改IP 执行命令 mongod config C Program Files MongoDB Server 4 4 bin mongod cfg logpath E MangoDB log mongod log l
  • Spring面试题

    1 Spring是什么 1 Spring是 个轻量级的控制反转和 向切 的容器框架 2 通过控制反转 IoC 的技术达到松耦合的 的 3 包含并管理应 对象 Bean 的配置和 命周期 这个意义上是 个容器 4 可以整合多种技术 2 谈谈你