当前位置: 首页 > news >正文

【百面成神】spring基础12问,你能坚持到第几问

在这里插入图片描述

前 言
🍉 作者简介:半旧518,长跑型选手,立志坚持写10年博客,专注于java后端
☕专栏简介:java面试宝典,特点:全、精、深、简,力求每个核心知识点1分钟回答好。
🌰 文章简介:本文将介绍spring核心的面试12问

文章目录

  • 一、Spring
    • 1.谈谈你理解的spring
    • 2.谈谈spring的优缺点
  • 二、IOC
    • 3.谈谈你对IOC的理解
    • 4.谈谈IOC的实现机制是什么
    • 5.从源码角度说下Spring IOC的加载过程
  • 三、bean
    • 6.聊聊你对Spring Bean的了解?
    • 7.Spring Bean的默认作用域是什么?它有什么优势
    • 8.Spring中bean是线程安全的吗?
    • 9.什么是自动装配?它有几种方式
    • 10.谈谈spring中bean的生命周期?
    • 11.Spring中Bean的循环依赖问题是如何解决的?
  • 四、注解
    • 12.@Component,@Repository,@Service,@Controller有什么区别?

一、Spring

1.谈谈你理解的spring

在这里插入图片描述

2.谈谈spring的优缺点

(1)优点:

先回顾下spring的特性:IOC、AOP、事务、功能性的封装

IOC带来的优点:

  • 集中管理了对象,使对象之间的耦合度降低了。

  • 对象的开发维护变得简单了。

AOP带来的优点:

  • 可以在不修改代码的情况下进行功能增强,并且减少了重复的代码,提高了代码的维护,降低了代码冗余

事务声明:

  • spring事务机制简化了开发

功能性的封装:

  • 封装了许多功能性代码,如jdbctemplate,也方便于集成各个优秀框架,可以帮助方便的使用三方框架,简化了开发。

源码:spring的底层大量运用反射、设计模式等,其源码也是不可多得的宝贵学习资料。

(2)缺点:

简化了开发,从应用角度上更好,但是对于底层的细节进行了封装,想要了解底层就更加困难。而且它大而全,源码代码量达百万,不易研究源码。

二、IOC

3.谈谈你对IOC的理解

IOC的意思是控制反转,控制反转的意思就是将创建对象的权力转移到容器来完成。

以前创建一个对象,是由程序员通过new一个对象来创建,这样会造成两个问题:
(1)耦合度过高,这其实本质上是面向接口编程的问题。如果通过硬编码写了一个superclass A= new subclass(),如果想要使用另外一个subclass,就需要更改源码重新编译。如果使用Spring IOC来做,只需要更改配置即可。

(2)维护不方便。在实际项目中一个 Service 类可能依赖了很多其他的类,假如我们需要实例化这个 Service,你可能要每次都要搞清这个 Service 所有底层类的构造函数,这可能会把人逼疯。如果利用 IoC 的话,你只需要配置好,然后在需要的地方使用@Autowired注解自动注入(DI)就行了,这大大增加了项目的可维护性且降低了开发难度。

控制反转可以达到解耦和方便维护的目的。

注:
Spring IOC和DI的区别是什么?
IOC是思想,DI是实现,是实现IOC的关键一步。

4.谈谈IOC的实现机制是什么

Spring IOC实际上是通过简单工厂设计模式和反射来实现的。所谓简单工厂设计模式其实就是通过传入一个标识,根据标识选择生产对应的对象。通过简单工厂模式(BeanFactory.getbean())会带来一个问题,就是需要给每一个对象提供一个创建的过程,如果创建的对象变化,还需要改源码。因此引入反射机制,将类的完整类路径作为参数传递给工厂,工厂通过反射机制直接获取对象返回即可。

注:为了方便理解,可以参考如下代码。
在这里插入图片描述

5.从源码角度说下Spring IOC的加载过程

第一步:通俗理解就是通过bean工厂的后置处理器将配置文件转化为一个对应的java类。
在这里插入图片描述
第二步:通俗理解就是通过简单工厂模式和反射来实例化对象
在这里插入图片描述
第三步:通俗理解就是通过依赖注入来完成对象的属性注入工作
在这里插入图片描述

三、bean

6.聊聊你对Spring Bean的了解?

(1) 什么是Spring Bean
被spring IOC容器管理、实例化的对象称之为spring的bean。

(2)怎么配置Spring Bean
可以通过如下四种方式配置Spring Bean。
在这里插入图片描述
(3)Bean有哪些作用域
单例、多例,request(针对web应用,一个请求创建一个request对象),session(web 应用,会话),application(一个全局的应用)

7.Spring Bean的默认作用域是什么?它有什么优势

Spring默认的Bean是单例,对象只会创建一次。

具有如下优势:
在这里插入图片描述

8.Spring中bean是线程安全的吗?

Spring默认的Bean是单例,多个线程操作的是同一个对象,如果在类中声明了成员变量,并且进行了读写操作(有状态),就会出现线程安全问题。

但是,我们如果把变量声明在方法中,就是线程安全的。将成员变量使用ThreadLocal修饰,将操作方法或者代码块加上synchronized同步锁(并行会变成串行,影响吞吐量),或者将bean设置为多例,也可以保证线程安全。

9.什么是自动装配?它有几种方式

自动装配就是指,spring中的对象无需手工创建其依赖对象,可以由容器创建需要依赖的对象并进行装配。
在这里插入图片描述

10.谈谈spring中bean的生命周期?

在这里插入图片描述

11.Spring中Bean的循环依赖问题是如何解决的?

循环依赖是指spring中多个对象相互依赖,导致在容器创建对象过程时出现互相嵌套的问题。

在这里插入图片描述

八股文结束。

详细理解:

循环依赖可以参考下图理解。
在这里插入图片描述
其中AServce的生命周期如下图。
在这里插入图片描述
在上图中要填充bService对象,就需要从单例池中获取一个bService对象。如果此时bService没有创建,在单例池找不到,因此需要触发bService的生命周期创建bService。而bService创建时,也需要填充aService,就会循环套娃,这就是所谓的循环依赖。

因此需要打破循环,因此需要从其它地方找到一个aService对象。因此可以考虑在aService的生命周期第一步就进行一次缓存(一级缓存),因为尽管此时已经有一个无参的aService对象了。具体的细节可以参考下图理解。

在这里插入图片描述
不过,上面的做法其实埋了坑。考虑如果aService执行了AOP,那么就会创建一个代理类,在生命周期的第五步,实际上加入单例池中是其代理类对象。而bService在填充时获得的是一个aService对象,这不就不一致了么。

实际上,在bService填充时应该也是填充一个aService的代理对象(加强了功能)。要做到这一点,就应该在第一步就进行aService的AOP。

按照这个思路走,aService的生命周期如下。

在这里插入图片描述
不过,这样bean的生命周期设计就乱了啊。第1步就创建AOP,第4步还创建不创建了?最好能够判断是否出现循环依赖,只有出现循环依赖时才提前创建AOP代理对象。可以在aService创建时就设置一个状态量进行下标记,如果在创建bService发现aService还没有创建完,就可以知道出现循环依赖问题了。
在这里插入图片描述
现在考虑三个对象的情况,如果aService还和cService也出现了循环依赖会咋样?答案是冗余操作。而且进行了两次AOP,那么bService和cService中填充的还是同一个代理对象么?不是了啊
那么我们在第一次AOP产生代理对象,把它放到单例池中不就可以了?

但是,单例池中是啥都可以放的吗?它只能够放一个完整的对象,这些过程中的对象你也放进去么?

还是分清楚点最后,引入二级缓存。

在这里插入图片描述
似乎大功告成了。不过现在可存在一个大问题。在2.1进行AOP生成代理对象时,代理对象需要有一个aService类型的属性啊。哦豁,还是没有啊。

引入三级缓存。问题解决。

在这里插入图片描述
实际上,第1步三级缓存中存的并不是一个aServce的对象,而是一个Lambda表达式,即一个函数式接口。其存储的源码如下。
在这里插入图片描述
为什么呢?这说明三级缓存只存储一个变量不够,它需要存储方法。实际上,它里面包含判断AOP判断是否要进行AOP代理的代码逻辑。

四、注解

12.@Component,@Repository,@Service,@Controller有什么区别?

  • @Component :通用的注解,可标注任意类为 Spring 组件。如果一个 Bean 不知道属于哪个层,可以使用@Component 注解标注。这是Repository,Service和Controller的元注解。
  • @Repository : 对应持久层即 Dao 层,主要用于数据库相关操作。
  • @Service : 对应服务层,主要涉及一些复杂的逻辑,需要用到 Dao 层。
  • @Controller : 对应 Spring MVC 控制层,主要用户接受用户请求并调用 Service 层返回数据给前端页面。

相关文章:

【百面成神】spring基础12问,你能坚持到第几问

前 言 🍉 作者简介:半旧518,长跑型选手,立志坚持写10年博客,专注于java后端 ☕专栏简介:java面试宝典,特点:全、精、深、简,力求每个核心知识点1分钟回答好。 &#x1f3…...

javaSE类和对象(下)

目录君1.封装2.访问限定符3.包的定义及使用4.static成员变量5.static成员方法6.代码块及其分类实例代码块静态代码块静态代码块与实例代码块的执行顺序static成员变量(类变量)初始化1.封装 面向对象程序三大特性:封装、继承、多态。而类和对象阶段,主要…...

【数据结构】第四站:单链表力扣题(二)

目录 一、链表的回文结构 二、相交链表 三、环形链表 四、环形链表Ⅱ 五、复制带随机指针的链表 一、链表的回文结构 题目描述:链表的回文结构_牛客题霸_牛客网 对于这道题,如果没有前面的一些题的基础,是非常难做的,我们的思…...

KafKa知识汇总

前言 汇总相关知识 Kafka快速实战与基本原理详解...

【RV1126】调试GT911,1024x600 7寸 MIPI 电容触摸屏

文章目录一、驱动注册失败二、触摸屏可以触摸,但是x轴数据反了三、可以触摸了,但是Y轴数据跳变,几乎只有一半的屏幕是可以正常滑动的三、汇顶触摸屏配置文件解析四、使用新的配置文件4.1 新配置解决问题4.2 测试触摸的方法在kernel增加frame …...

C的强符号/弱符号

首先上代码和结果&#xff1a; 代码&#xff1a; #include <stdio.h> int k; int k; int main() {printf("addr of k %p\n", &k);printf("value of k %d\n", k);return 0; }结果&#xff1a; addr of k 00408074 value of k 0问题&…...

AD/DA转换(XPT2046)

AD/DA介绍AD&#xff08;Analog to Digital&#xff09;&#xff1a;模拟-数字转换&#xff0c;将模拟信号转换为计算机可操作的数字信号DA&#xff08;Digital to Analog&#xff09;&#xff1a;数字-模拟转换&#xff0c;将计算机输出的数字信号转换为模拟信号AD/DA转换打开…...

乐观锁和悲观锁 面试题

Mysql的乐观锁和悲观锁 实现方式加锁时机常见的调用方式优势不足适用场景乐观锁开发自定义更新数据的时候sql语句中进行version的判断高并发容易出现不一致的问题高并发读&#xff0c;少写悲观锁Mysql内置查询数据的开始select * for update保证一致性低并发互联网高并发场景极…...

【Autoware规控】mpc_follower模型预测控制节点

文章目录1. 技术原理2. 代码实现1. 技术原理 MPC&#xff0c;即Model Predictive Control&#xff08;模型预测控制&#xff09;&#xff0c;是一种基于动态模型的控制算法。MPC算法通过建立系统的数学模型&#xff0c;根据当前状态和一定时间内的预测&#xff0c;优化未来的控…...

成果VR虚拟3D展厅让内容更丰富饱满

随着数字技术的不断发展和普及&#xff0c;数字化展厅成为了一种重要的展示形式。线上虚拟展厅作为数字化展示的一种新形式&#xff0c;采用虚拟现实技术&#xff0c;能够克服时空限制&#xff0c;打破传统展览业的展示模式&#xff0c;为用户提供更加丰富、立体、沉浸式的展览…...

【CE进阶】lua脚本使用

▒ 目录 ▒&#x1f6eb; 导读需求开发环境1️⃣ 脚本窗口Lua ScriptLua EngineAuto assemble2️⃣ 全局变量3️⃣ 进程当前打开的进程ID系统的进程列表系统的顶部窗口列表4️⃣ 线程5️⃣ 输入设备6️⃣ 屏幕7️⃣ 剪贴板&#x1f6ec; 文章小结&#x1f4d6; 参考资料&#x…...

【vue2】近期bug收集与整理02

⭐【前言】 在使用vue2构建页面时候&#xff0c;博主遇到的问题难点以及最终的解决方案。 &#x1f973;博主&#xff1a;初映CY的前说(前端领域) &#x1f918;本文核心&#xff1a;博主遇到的问题与解决思路 ⭐数据枚举文件的使用 同后端那边发送请求的时&#xff0c;请求返…...

2. 01背包问题

文章目录QuestionIdeasCodeQuestion 有 N 件物品和一个容量是 V 的背包。每件物品只能使用一次。 第 i 件物品的体积是 vi &#xff0c;价值是 wi 。 求解将哪些物品装入背包&#xff0c;可使这些物品的总体积不超过背包容量&#xff0c;且总价值最大。 输出最大价值。 输入…...

【Docker】CAdvisor+InfluxDB+Granfana容器监控

文章目录原生命令 docker stats容器监控3剑客CIGCAdvisorInfluxDBGranfanacompose容器编排&#xff0c;一套带走新建目录新建3件套组合的 docker-compose.yml检查配置&#xff0c;有问题才有输出 docker-compose config -q启动docker-compose文件 docker-compose up -d测试浏览…...

k8s 部署nginx 实现集群统一配置,自动更新nginx.conf配置文件 总结

k8s 部署nginx 实现集群统一配置&#xff0c;自动更新nginx.conf配置文件 总结 大纲 1 nginx镜像选择2 创建configmap保存nginx配置文件3 使用inotify监控配置文件变化4 Dockerfile创建5 调整镜像原地址使用阿里云6 创建deploy部署文件部署nginx7 测试使用nginx配置文件同步&…...

动态内存管理(上)——“C”

各位CSDN的uu们你们好呀&#xff0c;今天&#xff0c;小雅兰的内容是动态内存管理噢&#xff0c;下面&#xff0c;让我们进入动态内存管理的世界吧 为什么存在动态内存分配 动态内存函数的介绍 malloc free calloc realloc 常见的动态内存错误 为什么存在动态内存分配 我们已…...

GPT-4发布,这类人才告急,大厂月薪10W+疯抢

ChatGPT最近彻底火出圈&#xff0c;各行各业都在争相报道&#xff0c;甚至连很多官媒都下场“跟风”。ChatGPT的瓜还没吃完&#xff0c;平地一声雷&#xff0c;GPT-4又重磅发布&#xff01; 很多小伙伴瑟瑟发抖&#xff1a;“AI会不会跟自己抢饭碗啊&#xff1f;” 关于“如何…...

MySQL数据库实现主主同步

前言 MySQL主主同步实际上是在主从同步的基础上将从数据库也提升成主数据库&#xff0c;让它们可以互相读写数据库&#xff0c;从数据库变成主数据库&#xff1b;主从相互授权连接&#xff0c;读取对方binlog日志并更新到本地数据库的过程,只要对方数据改变&#xff0c;自己就…...

JavaScript传参的6种方式

JavaScript传参的方式1. 传递基本类型参数2. 传递对象类型参数3. 使用解构赋值传递参数4. 使用展开运算符传递参数5. 使用可选参数6. 使用剩余参数JavaScript是一门非常灵活的语言&#xff0c;其参数传递方式也同样灵活。在本篇文章中&#xff0c;会详细介绍JavaScript中的参数…...

蓝桥之统计子矩阵

样例说明 满足条件的子矩阵一共有 19 , 包含: 大小为 11 的有 10 个。 大小为 12 的有 3 个。 大小为13 的有 2 个。 大小为 14 的有 1 个。 大小为 21 的有 3 个。 前缀和二维数组 前缀和暴力搜索 import java.util.*; public class Main{private static int ans0;pub…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩

目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...

ssc377d修改flash分区大小

1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件

今天呢&#xff0c;博主的学习进度也是步入了Java Mybatis 框架&#xff0c;目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学&#xff0c;希望能对大家有所帮助&#xff0c;也特别欢迎大家指点不足之处&#xff0c;小生很乐意接受正确的建议&…...

ServerTrust 并非唯一

NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)

本期内容并不是很难&#xff0c;相信大家会学的很愉快&#xff0c;当然对于有后端基础的朋友来说&#xff0c;本期内容更加容易了解&#xff0c;当然没有基础的也别担心&#xff0c;本期内容会详细解释有关内容 本期用到的软件&#xff1a;yakit&#xff08;因为经过之前好多期…...

Android第十三次面试总结(四大 组件基础)

Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成&#xff0c;用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机&#xff1a; ​onCreate()​​ ​调用时机​&#xff1a;Activity 首次创建时调用。​…...

保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek

文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama&#xff08;有网络的电脑&#xff09;2.2.3 安装Ollama&#xff08;无网络的电脑&#xff09;2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...

c# 局部函数 定义、功能与示例

C# 局部函数&#xff1a;定义、功能与示例 1. 定义与功能 局部函数&#xff08;Local Function&#xff09;是嵌套在另一个方法内部的私有方法&#xff0c;仅在包含它的方法内可见。 • 作用&#xff1a;封装仅用于当前方法的逻辑&#xff0c;避免污染类作用域&#xff0c;提升…...

水泥厂自动化升级利器:Devicenet转Modbus rtu协议转换网关

在水泥厂的生产流程中&#xff0c;工业自动化网关起着至关重要的作用&#xff0c;尤其是JH-DVN-RTU疆鸿智能Devicenet转Modbus rtu协议转换网关&#xff0c;为水泥厂实现高效生产与精准控制提供了有力支持。 水泥厂设备众多&#xff0c;其中不少设备采用Devicenet协议。Devicen…...

《Docker》架构

文章目录 架构模式单机架构应用数据分离架构应用服务器集群架构读写分离/主从分离架构冷热分离架构垂直分库架构微服务架构容器编排架构什么是容器&#xff0c;docker&#xff0c;镜像&#xff0c;k8s 架构模式 单机架构 单机架构其实就是应用服务器和单机服务器都部署在同一…...