面试集中营—Spring篇

news2024/11/24 7:46:01

Spring 框架的好处

        1、轻量:spring是轻量的,基本的版本大约2MB;

        2、IOC:控制反转,Spring的IOC机制使得对象之间的依赖不再需要我们自己来控制了,而是由容易来控制,一个字:爽;

        3、AOP:切面编程,Spring提供的AOP技术可以把应用逻辑和系统服务分来,编码更灵活,更方便;

        4、MVC框架:如果使用过Struts2的同学,使用springmvc就会觉得非常的舒适,spring提供的mvc框架是一个非常优秀的Web框架;

        5、全局事务管理:Spring提供一个持续的事务管理接口,可以扩展到上至本地事务下至全局事务;

        6、统一异常处理:

Autowired 和 Resource 注解的区别

        共同点:都是做bean注入时使用的,都可以写在字段或者setter方法上面;

        不同点:

        1、包归属不同,@Autowired是Spring提供的注解,@Resource是javax提供的注解;

        2、寻找bean的方式不同,@Resource默认是优先根据名称查找bean,而@Autowired默认是优先根据类型查找bean

SpringMVC的运行机制

        这个问题已经很古老的,很多面试官也不会问,因为大家的侧重点都是在分布式高并发还有场景问题上。SpringMVC的处理请求过程或者说运行机制吧,大家可以通过设计模式的方式来去学习。

MVC模式

        MVC分别代表了Model、View、Controller三个处理节点

        C:控制器层,用于接受请求,调用业务类,最后派发页面;

        M:数据模型层(包含service、dao、entity)主要是处理业务数据并返回处理结果;

        V:视图渲染层,主要为了渲染页面。

        在当前前后端分离已经成为了一个常态的情况下,V已经逐渐淡化了,但是在5年前前后端分离还没有那么的成熟,如果回到2016年,当时主流前端线下课都还没有vue2的课程存在,就是三大框架+jquery;那么mvc这个模式就是老子天下第一;

工作原理 

        springmvc主要通过中央处理器(DispatcherServlet)来统一调度。如下图所示

Bean的生命周期 

        经典的问题。提到生命周期,我们应该想到的是spring能够IOC其实就是保存了一个bean的实例池,所以生命周期的前期一定是实例化和初始化,实例化就是把对象在内存空间中分配出来,初始化就是给对象的属性赋值。当一个bean完成了使命后就要面临销毁,就会有一个销毁的过程。

        只不过为了方便扩展,spring把实例化和初始化的过程进行了多重封装,方便开发者去介入bean的实例化过程。具体如下:

        1、实例化 Bean

        对于 BeanFactory 容器,当客户向容器请求一个尚未初始化的 bean 时,或初始化 bean 的时候需要 注 入 另 一 个 尚 未 初 始 化 的 依 赖 时 , 容 器 就 会 调 用 createBean 进 行 实 例 化 。 对于 ApplicationContext容器,当容器启动结束后,通过获取 BeanDefinition 对象中的信息,实例 化所有的 bean

       2、设置对象属性(依赖注入):

       实例化后的对象被封装在 BeanWrapper 对象中,紧接着, Spring 根据 BeanDefinition 中的信
息以及通过 BeanWrapper 提供的设置属性的接口完成依赖注入。
      

       3、处理 Aware 接口:

        接着,Spring 会检测该对象是否实现了 xxxAware 接口,并将相关的 xxxAware 实例注入 Bean

  • 如果这个 Bean 已经实现了 BeanNameAware 接口,会调用它实现的 setBeanName(String beanId)方法,此处传递的就是 Spring 配置文件中 Bean id 值;
  • 如果这个 Bean 已经实现了 BeanFactoryAware 接口,会调用它实现的 setBeanFactory()方法,传递的是 Spring 工厂自身。
  • 如果这个 Bean 已经实现了 ApplicationContextAware 接口,会调用setApplicationContext (ApplicationContext)方法,传入Spring上下文;

        4、BeanPostProcessor:

        如果想对 Bean 进行一些自定义的处理,那么可以让 Bean 实现了 BeanPostProcessor 接口,那将会调用 postProcessBeforeInitialization(Object obj, Strings方法。

        5、InitializingBean 与 init-method

        如果 Bean 在 Spring 配置文件中配置了 init-method 属性,则会自动调用其配置的初始化方法

        6、 如果这个Bean实现了BeanPostProcessor 接口,将会调用postProcessAfterInitialization (Object obj, Strings)方法;由于这个方法是在 Bean 初始化结束时调用的,所以可以被应用于内存或缓存技术;

       7、DisposableBean

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

      8、destroy-method

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

spring框架中都用到了哪些设计模式

1、简单工厂模式 Spring 中的 BeanFactory 就是简单工厂模式的体现。根据传入一个唯一的标识来获得Bean 对象,但是在传入参数后创建还是传入参数前创建,要根据具体情况来定。

2、工厂模式 Spring 中的 FactoryBean 就是典型的工厂方法模式,实现了 FactoryBean 接口的
bean 是一类叫做 factory bean 。其特点是, spring 在使用 getBean() 调用获得该 bean 时,
会自动调 用该 bean getObject() 方法,所以返回的不是 factory 这个 bean ,而是这个
bean.getOjbect() 方法的返回值。
3、单例模式 :在 spring 中用到的单例模式有:scope="singleton" ,注册式单例模式, bean 存放
Map 中。 bean name 当做 key bean 当做 value
4、原型模式 :在 spring 中用到的原型模式有:scope="prototype" ,每次获取的是通过克隆生成的新实例,对其进行修改时对原有实例对象不造成任何影响。
5、代理模式 Spring 中经典的 AOP ,就是使用动态代理实现的,分 JDK CGlib 动态代理。
6、适配器模式 Spring 中的 AOP AdvisorAdapter 类,它有三个实现:
MethodBeforAdviceAdapter AfterReturnningAdviceAdapter ThrowsAdviceAdapter Spring
会根据不同的 AOP 配置来使用对应的 Advice ,与策略模式不同的是,一个方法可以同时拥有多
个 Advice。 Spring 存在很多以 Adapter 结尾的,大多数都是适配器模式。
7、观察者模式 Spring 中的 Event Listener spring 事件: ApplicationEvent ,该抽象类继
承了 EventObject 类, JDK 建议所有的事件都应该继承自 EventObject spring 事件监听器:
ApplicationListener ,该接口继承了 EventListener 接口, JDK 建议所有的事件监听器都应该
继承 EventListener
8、模板模式 Spring 中的 org.springframework.jdbc.core.JdbcTemplate 就是非常经典的模板模
式的应用,里面的 execute 方法,把整个算法步骤都定义好了。

Spring是怎么解决循环依赖的?

       一句话就是spring是通过三级缓存来解决循环依赖的,所以如果有人问spring的三级缓存是干什么的,也是一样的,是解决循环依赖问题的。具体来说,就是A依赖B,B依赖C,C又依赖了A,产生了循环。spring在实例化Bean的过程中,当发现有一个属性是对象,就会尝试去获取这个对象的bean,递归调用又调用回来了,发现自身还在创建中,那么说明发生了循环依赖。解决流程如下:

        1、A先初始化第一步提前把自己暴露出来,(通过一个对象工厂的方式存在三级缓存中),

当发现依赖对象B时,就尝试获取B的bean;

         2、B没有创建,走创建流程,发现自己依赖的C也没有创建;

         3、C走创建流程,发现依赖A,此时A在三级缓存中,通过 ObjectFactory#getObject() 方法来拿到 A 对象,此时C顺利完成初始化,并将自己添加到一级缓存中;

         4、B拿到了C的bean,也完成了初始化,将自己添加到一级缓存中;

         5、A又拿到了B的bean,完成了初始化,将自己添加到一级缓存中;

Spring事务传播级别

        Spring 事务定义了 7 种传播机制:

        1. PROPAGATION_REQUIRED:默认的 Spring 事务传播级别,若当前存在事务,则加入该事务,若不存在事务,则新建一个事务。

        2. PAOPAGATION_REQUIRE_NEW:若当前没有事务,则新建一个事务。若当前存在事务,则新建一个事务,新老事务相互独立。外部事务抛出异常回滚不会影响内部事务的正常提交。

        3. PROPAGATION_NESTED:如果当前存在事务,则嵌套在当前事务中执行。如果当前没有事务,则新建一个事务,类似于 REQUIRE_NEW

        4. PROPAGATION_SUPPORTS:支持当前事务,若当前不存在事务,以非事务的方式执行。

        5. PROPAGATION_NOT_SUPPORTED:以非事务的方式执行,若当前存在事务,则把当前事务挂起。

        6. PROPAGATION_MANDATORY:强制事务执行,若当前不存在事务,则抛出异常.

        7. PROPAGATION_NEVER:以非事务的方式执行,如果当前存在事务,则抛出异常。

       

       

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

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

相关文章

【c++】Resharper 去掉中文注释拼写

参考大神: Resharper 去掉注释拼写 reshaper的中文注释一堆下划线,看的很累、很乱: options 里 在code inspetion里 搜索 去掉 Typo in comment 就可以不在中文注释提示 重启vs reshaperd 中文注释下划线没了。小番茄的还在。

数智先锋 | 多场景数据治理案例,释放数据要素生产力

数据作为第五大生产要素,成为释放新质生产力的关键基础。 当前各个行业数字化建设如火如荼,全力挖掘数据价值以驱动行业高质量应用发展。数据治理成为数据要素价值发挥的重要基础和前提。 数据治理不单是技术问题,不是依赖工具就能解决的&a…

数据结构学习/复习8--树与二叉树的概念与基本性质练习

一、树 1.概念 2.树的表示 二、二叉树 1.二叉树的概念 2.与性质相关的题

如何选择最适合企业的项目管理方法

企业的项目管理应该采取综合性的方式,结合多种工具和方法来确保项目的成功。甘特图 是其中一种非常有用的工具,它可以帮助项目经理和团队成员可视化地展示项目的时间线和进度。以下是采取合适项目管理方式时需要考虑的几个关键点,结合甘特图的…

Python项目实战,用Python实现2048游戏

目录 写在前言项目介绍项目思路环境搭建项目实现初始化Python类初始化游戏窗口定义游戏棋盘和方块移动和合并游戏主循环 进一步探索 写在前言 hello,大家好,我是一点,专注于Python编程,如果你也对感Python感兴趣,欢迎…

2024年5月6日优雅草蜻蜓API大数据服务中心v2.0.3更新

v2.0.3更新 2024年5月6日优雅草蜻蜓API大数据服务中心v2.0.3更新-修复改版后搜索框漏掉的bug-增加搜索框 提示:优雅草大数据中心已经 上线137天 稳定运行 1181555 次 累积调用 目前大数据中心用户呈现增长趋势,目标2024年11月底突破1亿次调用&#xf…

2023ccpc深圳G题相似基因序列问题

样例: 6 4 4 1 kaki kika manu nana tepu tero kaka mana teri anan 输出: 2 2 1 0 解析: 如果是用暴力的话是 300*300*6000,这样子一定会超时。 这时候我们可以利用hash函数进行处理,对比一个字符串的小于为O&a…

linux系统-PXE高效批量网络装机

目录 一、PXE概述 PXE批量部署的优点 搭建PXE网络体系的前提条件 二、搭建PXE远程安装服务器 1.修改网络配置 2 .老样子关防火墙!!!! 3.确保挂载状态 和yum库 4. 安装TFTP服务 5.修改TFTP服务的配置文件 6.启动服务 7…

鸿蒙开发接口Ability框架:【@ohos.application.FormExtension (FormExtension)】

FormExtension FormExtension模块提供了FormExtension卡片扩展相关接口。 说明: 本模块首批接口从API version 9开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 本模块接口仅可在Stage模型下使用。 导入模块 import FormExtension …

pcm转MP3怎么转?只需3个步骤~

PCM(Pulse Code Modulation)是一种用于数字音频编码的基础技术,最早起源于模拟音频信号数字化的需求。通过PCM,模拟音频信号可以被精确地转换为数字形式,为数字音频的发展奠定了基础。 MP3文件格式的多个优点 MP3的优…

Flyway使用教程

Flyway使用教程 背景: 在开发环境对多个不同版本的分支进行开发,如果此时涉及到多张表结构修改(比如新增字段),而在测试环境时却忘了整理SQL 脚本给测试人员执行,就会导致出现 bug,从而影响测试…

电子取证平航杯的复现

闻早起部分: 一、闻早起的windows10电脑 (1).“闻早起”所使用的笔记本电脑使用何种加密程式? 1.在EFI文件中找到加密程式 (2) 教徒“闻早起”所使用的笔记本电脑中安装了一款还原软件,其版本…

Stable Diffusion学习记录

文章目录 前言电脑配置推荐环境搭建下载地址安装步骤步骤一,打开下载的秋叶整合包,路径秋叶整合包/sd-wenui-aki步骤二,打开下载好的sd-webui-aki-v4.8.7解压包 Stable Diffusion软件配置,插件安装,模型下载Stable Dif…

基于EWT联合SVD去噪

一、代码原理 (1)基于EWT-SVD的信号去噪算法原理 经验小波变换(Empirical Wavelet Transform,EWT):EWT是一种基于信号局部特征的小波变换方法,能够更好地适应非线性和非平稳信号的特性。奇异值…

Redis探索之旅(基础)

目录 今日良言:满怀憧憬,阔步向前 一、基础命令 1.1 通用命令 1.2 五大基本类型的命令 1.2.1 String 1.2.2 Hash 1.2.3 List 1.2.4 Set 1.2.5 Zset 二、过期策略以及单线程模型 2.1 过期策略 2.2 单线程模型 2.3 Redis 效率为什么这么高 三…

如何取消xhr / fetch / axios请求

如何取消xhr请求 setTimeout(() > { xhr.abort() }, 1000)如何取消fetch请求 fetch()请求发送以后,如果中途想要取消,需要使用AbortController对象。 let controller new AbortController(); let signal controller.signal;fetch(url, {signal:…

Excel利用数据透视表将二维数据转换为一维数据(便于后面的可视化分析)

一维数据:属性值都不可合并,属性值一般在第一列或第一行。 二维数据:行属性或列属性是可以继续合并的,如下数据中行属性可以合并为【月份】 下面利用数据透视表将二维数据转换为一维数据: 1、在原来的数据上插入数据透…

#初始化列表

1.再谈构造函数 1.1构造函数的组成 构造函数包括函数体赋值与初始化列表初始化。 1.2函数体赋值 class Date { public:Date(int year, int month, int day){_year year;_month month;_day day;} private:int _year;int _month;int _day; };虽然上述构造函数调用之后&…

【数据结构】C++语言实现栈(详细解读)

c语言中的小小白-CSDN博客c语言中的小小白关注算法,c,c语言,贪心算法,链表,mysql,动态规划,后端,线性回归,数据结构,排序算法领域.https://blog.csdn.net/bhbcdxb123?spm1001.2014.3001.5343 给大家分享一句我很喜欢我话: 知不足而奋进,望远山而前行&am…

cmake进阶:文件操作

一. 简介 前面几篇文章学习了 cmake的文件操作,写文件,读文件。文章如下: cmake进阶:文件操作之写文件-CSDN博客 cmake进阶:文件操作之读文件-CSDN博客 本文继续学习文件操作。主要学习 文件重命名,删…