面试集中营—Spring篇

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:以非事务的方式执行,如果当前存在事务,则抛出异常。

       

       

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

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

相关文章

leetcode-有重复数字的全排列-98

题目要求 思路 1.同【没有重复项的全排列-97】这个题一样,都是递归的题,区别在于这个可能会包含重复的数字,因此,不能只是简单的通过两个值是否相等然后用标志位标记,而是新增了一个数组,这个数组专门用于…

libevent的使用

文章目录 libevent封装的框架思想常用函数分析使用fifo的读写未决和非未决bufferevent特性bufferevent函数客户端和服务器连接和监听libevent实现socket通信 libevent封装的框架思想 libevent框架:1. 创建 event_base (乐高底座)2. 创建 事件evnet 3. 将事件 添加…

【C++练级之路】【Lv.20】位图和布隆过滤器(揭开大数据背后的神秘面纱)

快乐的流畅:个人主页 个人专栏:《算法神殿》《数据结构世界》《进击的C》 远方有一堆篝火,在为久候之人燃烧! 文章目录 引言一、位图1.1 位图的概念1.2 位图的优势1.3 位图的模拟实现1.3.1 成员变量与默认成员函数1.3.2 test1.3.3…

AI智能分析视频监控行业的发展趋势和市场发展浅析

监控视频AI智能分析技术的现状呈现出蓬勃发展的态势,这一技术源于计算机视觉和人工智能的研究,旨在将图像与事件描述之间建立映射关系,使计算机能够从视频图像中分辨出目标信息。 在技术上,监控视频AI智能分析技术已经实现了对视…

Jenkins 2.164.3 安装插件(当前官网正式版本: 2.440.3 LTS)

Jenkins 2.164.3安装插件 1. 安装jenkins1.1 宿主机安装1.2 docker安装(linux) 2. 登录jenkins3. 修改配置文件 这篇文章如果放在5、6年前写出来毫无意义,因为安装2.164.3之后,推荐的插件即可自动安装。但是在2024年,当前正式版本是2.440.3 L…

【论文阅读】 Loss Functions for Image Restoration with Neural Networks

Loss Functions for Image Restoration with Neural Networks 论文地址摘要I. 引言II 相关工作用于图像恢复的神经网络B 找到更好的解决方案。 三、图像恢复的损失层A. l1 错误 The l1 ErrorB. SSIMC. MS-SSIMD. The Best of Both Worlds: MS-SSIM L1 四、结果A. Joint Denois…

四化智造MES(WEB)对接打通金蝶云星空余料入库查询(入库记录查询)接口与生产退料单新增接口

四化智造MES(WEB)对接打通金蝶云星空余料入库查询(入库记录查询)接口与生产退料单新增接口 接通系统:四化智造MES(WEB) “MES助力智能制造过程控制:MES管理生产订单的整个生产流程,通过对生产过…

npm install 及使用cordova打包常见错误大全(附解决方案)

问题1、cb() 这是我们在install过程中最最常见问题,网络上的解决方式也都是大同小异,要么就是升级node(误人子弟),项目里的node是不可以随意升级的,它有可能会导致其他依赖又不适配,起始很多时候就是由于咱们配置的镜像…

Linux基础之git与调试工具gdb

目录 一、git的简单介绍和使用方法 1.1 git的介绍 1.2 git的使用方法 1.2.1 三板斧之git add 1.2.2 三板斧之git commit 1.2.3 三板斧之git push 二、gdb的介绍和一些基本使用方法 2.1 背景介绍 2.2 基本的使用方法 一、git的简单介绍和使用方法 1.1 git的介绍 Git是一…

记录一下3月底到4月的前端开发工程师面经

文章会持续更新 1.https 原理(加密 证书) 客户端使用https的url访问web服务器,要求与服务器建立ssl连接web服务器收到客户端请求后,会将网站的证书(包含公钥)传送一份给客户端客户端收到网站证书后会检查证…

学术咸鱼入门指南(2)

巧用思维导图阅读文献 化整为零:读文献,从拆分文章的结构开始 大家在初步接触自己学科的论文时,要了解清楚基本的范式,日后读起来就比较顺了。 科研论文的第一部分,是文章的标题,摘要和关键词&#xff0…

HNU-人工智能-作业1

人工智能-作业1 计科210x 甘晴void 第1题 考虑一个实时的在线电话翻译系统,该系统实现英语与日语之间的实时在线翻译,讨论该系统的性能度量,环境,执行器,感知器,并对该环境的属性进行分析。(10…

革新品质检测,质构科技重塑肉类行业新篇章

革新品质检测,质构科技重塑肉类行业新篇章 在现代社会,消费者对食品安全和品质的要求日益提升,特别是在肉类行业。为了满足这一市场需求,质构科技凭借其精准、高效的优势,正逐渐成为肉类品质检测的新星。今天&#xf…

网络安全的未来:挑战、策略与创新

引言: 在数字化时代,网络安全已成为个人和企业不可忽视的议题。随着网络攻击的日益频繁和复杂化,如何有效保护数据和隐私成为了一个全球性的挑战。 一、网络安全的现状与挑战 网络安全面临的挑战多种多样,包括但不限于恶意软件、…

iPhone查看本机号码只需要这3招,不再为号码忘记犯愁!

在日常生活中,我们经常需要使用手机号码进行各种通讯活动,但有时候会忘记自己的手机号码,让人感到非常尴尬。不过,如果您是iPhone用户,那么您可以放心了!因为在iphone查看本机号码只需要简单的几个步骤&…

ShardingSphere 5.x 系列【27】 数据分片原理之 SQL 改写

有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot 版本 3.1.0 本系列ShardingSphere 版本 5.4.0 源码地址:https://gitee.com/pearl-organization/study-sharding-sphere-demo 文章目录 1. 概述2. 正确性改写2.1 标识符改写2.1.1 表名称2.1.2 索引名称2.1.3 Schem…

618好物节不知道买什么?快收下这份好物推荐指南!

随着618好物节的临近,你是否在为选择什么产品而犹豫不决?不用担忧,我精心准备了一份购物指南,旨在帮助你发现那些性价比高、口碑爆棚的商品。无论是科技新品还是生活小物件,这份指南都能帮你快速定位到那些值得投资的好…

若依前后端分离部署nginx

1、v.sj 2、生产环境修改 3、退出登录修改 4、路由改为hash模式 5、nginx配置 location /gldhtml/ {alias D:/java/tool/nginx-1.19.6/project/jxal/html/; } location /jxal/ {proxy_pass http://localhost:8081/; }

软信天成:CDMP数据管理专业人员认证9大要点【干货篇】

软信天成在上期文章中为大家分享了CDMP认证的基础内容。 上期文章:软信天成:CDMP数据管理专业人员认证详细介绍(基础篇)-CSDN博客 为方便诸位报考,软信根据考过CDMP的小伙伴经验分享,帮大家梳理了详细的考…

使用Beego创建API项目并自动化文档

最近需要使用Go写一个Web API项目,可以使用Beego与Gin来写此类项目,还是非常方便的,这里就介绍一下使用Beego来创建的Web API项目并自动化文档的方法。 使用Gin创建API项目并自动化文档参见:使用Gin编写Web API项目并自动化文档 …