Spring框架的应用(面试题)

news2024/9/20 8:00:36

目录

14. Spring框架中的Bean的作用域

通过XML方式设置bean的作用域

通过注解方式设置bean的作用域

15. Spring框架中的Bean的线程安全

16.Spring 框架中的Bean生命周期

17.Spring 框架如何解决循环依赖?

18.Spring 框架中有哪些注解?

19.Spring 框架中用到的设计模式

21.Spring AOP 和 AspectJ AOP 有什么区别?

22.Spring AOP有哪些通知类型?

23.Spring 管理事务的方式有几种?

24.Spring 事务中有哪几种事务传播行为?

25.Spring事务中有哪几种事务隔离级别?

26.Spring 事务在什么情况下会失效?

27.谈谈对SpringMVC的理解?

28.SpringMVC的工作原理(执行流程)?

29.SpringMVC的核心组件有哪些?


14. Spring框架中的Bean的作用域

singleton : Spring 只会为该 bean对象只会创建唯一实例,Spring 中的bean默认都是单例;

prototype:每次获取bean,Spring会创建一个新的bean 实例;

request:每一次HTTP 请求,Spring会创建一个新的bean 实例;

session:不同的HTTP会话,Spring会创建不同的bean 实例;


通过XML方式设置bean的作用域

<bean id="demoDaoBean" class="com.apesource.dao.DemoDAOImpl" scope="singleton" />

通过注解方式设置bean的作用域

@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)

public class DemoDAOImpl implements IDemoDAO{ }

15. Spring框架中的Bean的线程安全

·对于prototype作用域的Bean,每次都创建一个新对象,也就是线程之间不存在Bean共享,因此不会有线程安全问题

·对于singleton作用域的 Bean,所有的线程都共享一个单例状态的 Bean,存在资源竞争,因此是存在线程安全问题的

·解决办法:

对于singleton作用域的单例bean,它的线程安全问题,常见有两种解决办法:

在bean中尽量避免定义可变的成员变量(用于保存数据的成员变量);

在类中定义一个ThreadLocal成员变量,将需要可变的成员变量保存在ThreadLocal中;


16.Spring 框架中的Bean生命周期

Spring Bean 的生命周期总体分四个阶段:实例化=>属性注入 =>初始化 => 销毁

        实例化 Bean:根据配置文件中 Bean 的定义,利用 Java Reflection 反射技术创建 Bean的实例

注入对象依赖的属性值(或对象)

        处理各种Aware接口:Spring 会检测该 Bean 是否实现了 xxxAware 接口,通过 Aware类型的接口,可以让Spring框架为当前 Bean 注入相应的内容:

        如果 Bean 实现 BeanNameAware 接口,会调用它实现的 setBeanName(String beanId)方法,注入 Bean 的名字;

        如果 Bean 实现 BeanclassLoaderAware 接口,调用 setBeanclassLoader()方法,注入ClassLoader对象的实例:

        如果 Bean 实现 BeanFactoryAware 接口,会调用它实现的 setBeanFactory()方法,注入的是 Spring 工厂。

        如果 Bean 实现 ApplicationContextAware 接口,会调用 setApplicationcontext()方法,注入 Spring 上下文;

执行BeanPostProcessor前置处理:如果想对 Bean 进行一些自定义的前置处理,那么可以让 Bean 实现了 BeanPostProcessor 接口,将会在该阶段调用 postProcessBeforeInitialization(Object obj,String s)方法

执行InitializingBean初始化方法:如果 Bean 实现了InitializingBean 接口,执行

afterPropertiesSet()方法。

执行init-method自定义初始化方法:如果 Bean 在 Spring 配置文件中配置了

init-method 属性,则会自动调用其配置的初始化方法。

执行BeanPostProcessor后置处理:如果这个 Bean 实现了BeanPostProcessor接口,将会调用 postProcessAfterInitialization(0bject obj,string s)方法,由于这个方法是在 Bean 初始化结束后调用

以上几个步骤完成后,Bean已经被正确创建,可以正常使用这个Bean了

执行DisposableBean销毁Bean:当 Bean 不再需要时,会经过清理阶段,如果 Bean 实现了 DisposableBean 这个接口,会调用其实现的 destroy()方法执行销毁;

执行destroy-method自定义销毁方法:如果这个 Bean 的 Spring 配置中配置了 destroy-method 属性,会自动调用其配置的自定义销毁方法。


17.Spring 框架如何解决循环依赖?

循环依赖问题是指:类与类之间的依赖关系形成了闭环,就会导致循环依赖问题的产生。例如 A类依赖了B类,B类依赖了C类,而最后C类又依赖了A类,这样就形成了循环依赖问题;


18.Spring 框架中有哪些注解?

用于声明 Bean 的注解:

@component :定义通用Bean的注解,可标注任意类为 Bean 。如果一个 Bean 不知道属于哪个层,可以使用 @component 注解标注

@Repository:定义数据访问层Bean的注解,

@service :定义业务层Bean的注解

@Controller:定义控制器Bean的注解:

用于注入的注解:

@Autowired:按类型自动注入

@Qualifier :按名称自动注入

·声明配置、扫描、启用特性的注解:

@configuration:声明配置类

@Componentscan:组件扫描

@Enablescheduling:启用任务调度

@EnableAspectJAutoProxy:启用自动代理工厂


19.Spring 框架中用到的设计模式

工厂模式:Spring 使用工厂模式,通过 BeanFactory 或 Applicationcontext 来创建对象;

单例模式:Bean 默认作用域为单例,按照单例设计模式进行设计实现;

策略模式:Resource 的实现类,针对不同的资源文件,实现了不同方式的资源获取策略

代理模式:Spring 的 AOP 的实现依靠动态代理(JDK的反射和CGLIB)

模板方法:Spring 提供了 JdbcTemplate,RedisTemplate等模板对象,将相同的操作步骤进行了封装,

适配器模式:Spring AoP 的增强或通知(Advice)使用到了适配器模式,Spring Mvc 中也用

到了适配器模式适配 Controller;


21.Spring AOP 和 AspectJ AOP 有什么区别?

关键字:增强方式的差异(运行时、 编译时),实现方式的差异(动态代理、字节码操作)

SpringA0P已经集成了AspectJ,AspectJ是一个Java技术生态系统中实现 AOP 编程思想的独立框架; AspectJ 相比于 Spring AOP 功能更加强大,但是 Spring AOP 相对来说更简单更容易;

Spring AOP 属于运行时增强,而AspectJ是编译时增强,

Spring AOP 基于动态代理(Proxying),而 AspectJ 基于字节码操作( Bytecode Manipulat

ion );


22.Spring AOP有哪些通知类型?

关键字:分别介绍每种通知的实现接口,执行方式

前置通知:实现 MethodBeforeAdvice 接口,在目标方法调用前,执行通知;

环绕通知:实现 MethodInterceptor 接口,是一个包围目标方法的通知。环绕通知可以在方法调用前后完成自定义的行为。

后置通知:实现 AfterReturningAdvice 接口,在在目标方法调用后,执行通知(如果方法抛出异常,则不执行通知);

异常通知:实现 ThrowsAdvice 接口,在方法抛出异常时,执行通知;


23.Spring 管理事务的方式有几种?

编程式事务 : 在代码中硬编码(不推荐使用):通过 TransactionTemplate 或者

TransactionManager 手动管理事务,实际应用中很少使用,用于理解Spring事务管理。

声明式事务:在 XML 配置文件或者基于注解 @Transactional(推荐使用) 通过 AOP 实现。


24.Spring 事务中有哪几种事务传播行为?


25.Spring事务中有哪几种事务隔离级别?


26.Spring 事务在什么情况下会失效?

1.数据库不支持事务

Spring 事务生效的前提是所连接的数据库要支持事务,如果底层的数据库都不支持事务,则Spring的事务肯定会失效。例如:如果使用的数据库为 MySQL,并且选用了MyISAM 存储引擎,则 Spring 的事务就会失效。

2.事务方法未被Spring管理

如果事务方法所在的类没有加载到 Spring 1oc 容器中,也就是说,事务方法所在的类没有被 spring 管理,则 Spring 事务会失效。例如: Productservice 类上没有标注 @service 注解,Product的实例没有加载到 Spring IOC 容器中,就会造成 updateProductstockcountById()方法的事务在 Spring 中失效。

3.方法没有被public修饰

4.同一类中方法调用

5.未配置事务管理器

6.方法的事务传播类型不支持事务

7.不正确的捕获异常

8.错误的标注异常类型


27.谈谈对SpringMVC的理解?

首先, MVC 模式 是模型( Model)、视图( view)、控制器( controller )的简写,其核心思想是通过将请求处理控制、业务逻辑、数据封装、数据显示等流程节点分离的思想来组织代码。

所以, MVC 是一种设计模式,而 Spring MVC 是一款基于 MVC 设计模式思想实现的的 MVC 框架,属于Spring技术栈的一部分。SpringMVC可以帮助我们进行更简洁的 web 层的开发,并且它天生与 spring 框架集成,更利于架构的设计与搭建。


28.SpringMVC的工作原理(执行流程)?

1、客户端(浏览器)发送请求, 统一由 Dispatcherservlet 拦截处理请求。

2、DispatcherServlet 根据请求信息调用 HandlerMapping。HandlerMapping 根据 url 去匹配查找能处理的 Handler(也就是我们定义的 controller 控制器),并会将请求涉及到的接截器和 Handler 一起封装。

3、DispatcherServlet 调用 HandlerAdapter 适配执行 Handler

4、Handler 完成对用户请求的处理后,会返回一个 ModelAndView 模型视图对象给 DispatcherServlet 。 ModelAndView 中包含了数据模型以及相应的视图信息。 Model 是返回的数据对象,View 是 view 视图的逻辑名称。

5、ViewResolver 会根据逻辑 View 名称査找并解析实际的 View 视图文件,并根据 DispaterSevlet 返回的 Model 数据模型传给 View 视图文件,进行渲染执行,产生响应结果。

6、 DispaterServlet 负责将响应结果,输出至客户端浏览器。


29.SpringMVC的核心组件有哪些?

Dispatcherservlet :核心处理器,负责统一接收请求、将请求分发至不同的控制器,并负责客户端响应。

Handlermapping :处理器映射器,根据 url去匹配査找能处理的 Handler ,并会将请求涉入到的拦截器和 Handler 一起封装。

HandlerAdapter :处理器适配器,根据 HandlerMapping 找到的 Handler,适配执行对应的 Handler;

Handler :请求处理器,处理实际请求的处理器。

ViewResolver :视图解析器,根据 Handler 返回的逻辑视图名称,解析并渲染真正的视图文件,并传递给 DispatcherServlet 响应至客户端

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

uniapp在线下载安装包更新app

首先用getSystemInfo判断平台、 再通过json文件模拟接口 判断版本号是否一致 不一致则下载服务器apk进行更新 外加网络波动导致失败重新下载更新包 uni.getSystemInfo({success: function (e) {// #ifndef H5// 获取手机系统版本const system e.system.toLowerCase();const pl…

博世(BOSCH)× Milvus:智能驾驶领域的数据挖掘革新

01.博世智能驾控&#xff1a;智能驾驶技术的领航者 博世&#xff08;BOSCH&#xff09;智能驾控是全球汽车技术领域的领导者&#xff0c;以其在自动驾驶技术上的创新和深厚历史而闻名。博世的自动驾驶解决方案&#xff0c;包括先进的驾驶辅助系统&#xff08;ADAS&#xff09;…

四十二、大数据技术之Kafka3.x(5)

&#x1f33b;&#x1f33b; 目录 一、Kafka-Eagle 监控1.1 MySQL 环境准备1.2 Kafka 环境准备1.3 Kafka-Eagle 安装1.4 Kafka-Eagle 页面操作 二、集成 SpringBoot2.1 前期准备2.2 SpringBoot 生产者2.3 SpringBoot 消费者 三、集成 Spark&#xff08;拓展 Scala 语言&#xf…

Depth Anything: Unleashing the Power of Large-Scale Unlabeled Data精读

文章目录 1.摘要2.引言2.相关工作3.Depth Anything3.1 Learning Labeled Images3.2. Unleashing the Power of Unlabeled Images3.3. Semantic-Assisted Perception 4. Experiment4.1. 实施细节4.2. 零样本相对深度估计4.3. 微调至度量深度估计4.3.1 领域内度量深度估计4.3.2 零…

数的个位相加

给定一个非负整数 num&#xff0c;反复将各个位上的数字相加&#xff0c;直到结果为一位数。返回这个结果。 示例 1: 输入: num 38输出: 2 解释: 各位相加的过程为&#xff1a; 38 --> 3 8 --> 11 11 --> 1 1 --> 2 由于 2 是一位数&#xff0c;所以返回 2。…

pytorch分布式训练卡住,显卡占用100

1、问题 使用pytorch进行分布式训练&#xff0c;一机多卡&#xff0c;采用 DistributedDataParallel 方式&#xff0c;多次执行卡在了同一个地方。但是单卡和 DataParallel 方式都没有卡住的现象。 执行nvidia-smi&#xff0c;此时全部GPU利用率均为100%&#xff1a; 2、debug…

【建模与仿真】一文搞定AFSIM

&#x1f60a;你好&#xff0c;我是小航&#xff0c;一个正在变秃、变强的文艺倾年。 &#x1f514;本文讲解【建模与仿真】一文搞定AFSIM&#xff0c;期待与你一同探索、学习、进步&#xff0c;一起卷起来叭&#xff01; 目录 一、CMAKE二、AFSIM前言架构元素核心应用核心架构…

《学会 SpringBoot 系列 · ConfigurableApplicationContext 详解》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; CSDN入驻不久&#xff0c;希望大家多多支持&#xff0c;后续会继续提升文章质量&#xff0c;绝不滥竽充数…

WordPress多用途电子商务博客新闻主题betheme 21.5.6版本

简介&#xff1a; WordPress多用途电子商务博客新闻主题betheme 21.5.6版本 自带500多套模板 BeTheme第一次发布于2014年5月21日&#xff0c;自那时以来&#xff0c;已有数以百万计的人下载了BeTheme&#xff0c;其评分为4.8。 这个主题是WooCommerce支持的&#xff0c;在此…

UniApp第一天

一、官网介绍 1.1、 SDK SDK是"Software Development Kit"的缩写&#xff0c;中文意思是“软件开发工具包”。SDK通常是由软件开发者为其他开发者提供的一个软件工具集合&#xff0c;用于帮助开发者快速开发、测试和部署软件应用。SDK通常包含了一系列的开发工具、库…

让3岁小孩都能理解LeetCode每日一题_3148.矩阵中的最大得分

解释说明&#xff1a; 上面的内容的意思是为了有只移动一次的情况&#xff0c;而后面的grid&#xff08;i,j)-grid(i,k)由于j严格大于k,所以至少移动了一次&#xff0c;前面可以保持不移动&#xff0c;不移动就是选择0。 class Solution {public int maxScore(List<List&l…

倍福EAP协议应用讲解

倍福EAP协议应用讲解 前言 倍福提供了用于在以太网上进行实时通信的EtherCAT协议&#xff0c;EtherCAT协议属于现场层协议&#xff0c;即具有主从结构&#xff0c;通信只能由主站发起&#xff0c;从站不具备发起通信的功能&#xff0c;只能被动接收数据并插入数据到通信帧中。…

Java基础之switch分支语句

switch分支语句 ​ switch语句也称为分支语句&#xff0c;其和if语句有点类似&#xff0c;都是用来判断值是否相等&#xff0c;但switch默认只支持byte、short、int、char这四种类型的比较&#xff0c;JDK8中也允许String类型的变量做对比。 语法&#xff1a; switch (表达式…

了解数据库中常用存储引擎数据结构(3)

接上文了解数据库中常用存储引擎数据结构&#xff08;2&#xff09;-CSDN博客 目录 CoW BTree 补充&#xff1a;写入时复制&#xff08;Copy-on-write&#xff0c;简称COW&#xff09;是一种计算机程序设计领域的优化策略&#xff1b; Lazy BTree&#xff08;惰性BTree&…

【Linux】缓冲区和文件系统

目录 一、缓冲区 1.1 概念 1.2 用户缓冲区和内核缓冲区 二、磁盘的结构 三、文件系统 3.1 初识“块”和inode 3.2 磁盘分区和文件系统 一、缓冲区 1.1 概念 要理解什么是缓冲区&#xff0c;先看这段代码 #include <stdio.h> #include <string.h> #includ…

OpenTelemetry:新一代的开源可观测性标准

OpenTelemetry是由OpenTracing和OpenCensus两个开源项目合并而成&#xff0c;由云原生计算基金会&#xff08;CNCF&#xff09;托管。该项目旨在提供一套标准化的、跨语言的观测性工具&#xff0c;帮助开发人员和运维人员更好地理解和管理分布式系统的性能和行为。通过统一的Me…

html5宠物网站模板源码

文章目录 1.设计来源1.1 主界面1.2 主界面菜单1.3 关于我们界面1.4 宠物照片墙界面1.5 宠物博客界面1.6 宠物服务界面1.7 宠物团队界面1.8 联系我们界面 2.效果和源码2.1 源代码 源码下载万套模板&#xff0c;程序开发&#xff0c;在线开发&#xff0c;在线沟通 【博主推荐】&a…

微信小程序同城信息共享

前端uniapp 后端thinkphp 热乎的纯手工代码

机械学习—零基础学习日志(如何理解线性代数3)

零基础为了学人工智能&#xff0c;正在快乐学习&#xff0c;每天都长脑子 行列式 最早行列式&#xff0c;是莱布尼茨用于判断&#xff0c;一个方程有没有解。例如&#xff0c;三元一次方程&#xff0c;如果有解&#xff0c;对应行列式就有值&#xff0c;但是如果无解&#xf…

一篇文章理清Java持久化脉络(关于JDBC、JPA、Hibernate、Spring Data JPA)

Java持久化 一、JDBC、JPA、Spring Data JPA 的定义及关系二、JDBC&#xff08;古老的东西&#xff0c;只需简单知道是啥&#xff09;1.1 JDBC概念1.2 JDBC示例 三、JPA&#xff08;第二代持久化&#xff0c;代表是Hibernate等框架&#xff09;3.1 JPA概念3.2 JPA示例 四、Spri…