面试问答之Spring进阶

文章目录

  • 🐒个人主页:信计2102罗铠威
  • 🏅JavaEE系列专栏
    • 📖前言:
    • 🎀说说你对Spring的认识与理解
    • 🐕Bean的分类
    • 🐕 BeanFactory 接口和ApplicationContex 接口 的区别
    • 🐕SpringBean的声明周期
      • 🪀销毁Bean对象的方式
      • 🪀初始化Bean对象
    • 🐕Spring中的Bean是线程安全的吗?
    • 🐕 Bean循环依赖问题
    • 🐕Spring注解
      • 🪂声明Bean的注解
      • 🪂Bean的生命周期注解
      • 🪂依赖注入Bean的注解
      • 🪂切面通知相关注解(AOP)
      • 🪂SpringWeb中常用注解
    • 🐕SpringBoot注解
      • 🦓SpringBoot自动装配的实现原理

🐒个人主页:信计2102罗铠威

🏅JavaEE系列专栏

📖前言:

本篇博客主要以总结面试过程中对spring常问的考察点
在这里插入图片描述

🎀说说你对Spring的认识与理解

Spring是一款轻量级的、非侵入式的,具有IOC、AOP功能的一站式集成框架。目的是简化企业开发

轻量级源于它的核心jar包只有3MB大小,非侵入式是指开发者不需要写多余的类来实现它)
IOC功能: (控制反转)就是将创建对象的权利交给Spring框架,有Spring框架帮助我们管理对象。

依赖注入: 对象不用我们创建,在Spring启动时通过注解会自动注入一个代理对象,帮助我们调用方法。(它可以通过xml文件<bean标签来配置属性、构造方法、原型还是单例 或者通过注解的方式注入)

AOP功能:(面向切面编程)它是一种策略,与OOP(面向对象)作区分,OOP它是一种思想,是对宏观的把控。而AOP更像一种战术策略,它是将业务代码与非业务代码隔离开,通过创建代理对象的方式,让代理对象帮助实现业务功能和一些其他功能。场景:统一异常管理、事务、日志

一站式: 是指Spring的功能模块很多,例如SpringWeb、数据持久层、逻辑处理层都有,并且还可以集成很多的插件以及框架 例如:mybatis框架、lombok插件。

🐕Bean的分类

singleton :(单例bean)(默认的) 一个类只创建一个bean对象。
prototype : (原型bean) 每获取一次,就创建一次bean对象,
request : (请求bean) 每发一个HTTP请求就创建一个bean对象
session : (会话bean)一个会话(浏览器建立连接->关闭)创建一个bean对象

🐕 BeanFactory 接口和ApplicationContex 接口 的区别

BeanFactory 类 是一个抽象接口,他是创建bean对象相关的最顶级的接口,它里面定义了创建对象的抽象方法。ApplicationContex接口间接继承了它。(打个比方把spring看作巨人, BeanFactory可以看成巨人的心脏 ,而ApplicationContex可以看成巨人的身体)最终ClassPathXmlApplicationContex实现类间接实现了ApplicationContex
在这里插入图片描述

🐕SpringBean的声明周期

大致分为5个阶段:

  1. 实例化(原本对象)
  2. 属性赋值
  3. 初始化(Bean对象)
  4. 将Bean对象放入容器,使用(依赖注入)
  5. 销毁Bean对象

其中第三步“初始化” 与 第五步 “销毁” 有考察点

🪀销毁Bean对象的方式

第一种:实现 DisposableBean 接口,重写它的destroy方法
第二种: 使用xml配置 ,在<bean> 标签中右destroy-method属性可以指定毁灭Bean对象的方法。

在这里插入图片描述

🪀初始化Bean对象

会检测我们的类是否实现了某些接口,如过实现了,就会执行相应的方法。
AOP额外功能的增强也是在初始化过程中进行的。
在这里插入图片描述
在这里插入图片描述

🐕Spring中的Bean是线程安全的吗?

如果是单例bean,需要使用TreadLocal生成本地变量副本,来保证线程安全。
如果是原型bean,每次都会获取一个Bean对象,是线程安全的。

Bean 又分为有状态无状态
有状态的: 可以存储数据,例如 int num=0; 这种不是线程安全的,需要我们进行控制。
无状态的: 只在方法里面调用其他方法, 例如 LoginDao logindao; 进入方法后 loginDao.find(); 那么它是线程安全的,因为他没有涉及Bean对象的数据改变

🐕 Bean循环依赖问题

A中依赖了B,B中依赖了A (“用关联更确切”),如果不考虑Spring中的循环依赖,那么它就不是一个问题。是常见现象。但在Spring中BeanA初始化需要(依赖注入)@Autowired BeanB,而BeanB初始化需要(依赖注入)@Autowired BeanA,此时A还没有成为Bean对象,无法依赖注入,很容易会造成死锁。在Spring中是这样解决的,
在这里插入图片描述
在这里插入图片描述
过程:

1.创建半成品A , 需要B,
2.从一级缓存中没找到Bean B ,将半成品A放入二级缓存,用于初始化A的工厂放入三级缓存
3. 创建半成品B ,需要A,
从一级缓存没找到Bean A,,移除三级缓存中的A工厂,将二级缓存中半成品A注入到B中,初始化完成Bean B对象放入一级缓存
4.A从一级缓存中拿到Bean B 完成初始化Bean A并且Bean A也放入一级缓存。

在这里插入图片描述

在这里插入图片描述

🐕Spring注解

🪂声明Bean的注解

@RestController 常用在控制器层上
@Service 用在逻辑处理层(业务层)
@Repository 用在数据持久层
@Component 用在model模块中
并且@RestController @Service @Repository 都可以成为@Component ,只是为了区分不同模块的功能而使用的特定的注解。

🪂Bean的生命周期注解

(支持xml配置<bean>标签中的scope属性,效果相同)
@Scope设置类型包括
singleton 、protetype 、requst 、session、 globalSession

🪂依赖注入Bean的注解

@Autowired :由Spring提供
@Qualifier :当有多个统一类型的Bean时,可以使用@Qualifier(value=“adminDao”)来指定,与@Autowired配合使用
@Resource (name=“adminDao”) :java JDK提供,(默认是@Autowired功能,有参数的话是@Qualifier,如果找不到,还是@Autowired功能)

🪂切面通知相关注解(AOP)

(连接点:目标类中可以被增强的方法)
(切入点:类中实际被增强的方法)
(切面:把通知添加到切入点的过程)
@Aspect 定义一个切面,
@Before 在方法执行之前执行
@AfterReturning 在方法结束后执行(如果有异常,就不执行)
@After 在方法结束/异常后最终执行,无论是否有异常(类似于finally)
@ AfterThrowing 异常通知
@ Around 环绕通知,可以在方法执行前,执行后执行,算一个万能的

🪂SpringWeb中常用注解

@RestController 相当于一个组合注解:【 @Controller +@ResponseBody组合 】注解在类上,相当于所有的方法都加上了@ResponseBody
@RequestMapping :用于映射的Web请求,包括路径和参数
在这里插入图片描述
@RequestBody 支持异步响应请求,将数据存放于Response内,返回json格式响应给前端
@RequestBody :允许Request参数在Request体/载荷中,而不是直接连接在地址后面(get请求),具体表现为:自动与属性名相同的属性映射
@RequestHeader :请求头中的数据,因为请求头中可以携带token
@Param (“id”) :指定参数,需要和请求中的参数保持一致,常用语get请求。

其他类型的注解
@JsonFormat 日期格式化,标注在属性上面,使用正则表达式 +时区 可以进行 日期格式化
@Transactional 事务,注解可以在类和方法上,(如果注解在类上,那么类中的方法都会在事务中运行,尽量在service层使用)

🐕SpringBoot注解

@SpringBootApplication是一个组合标签,定义在项目的启动类上
他里面包括三个重要的标签:@Configurantion @EnableAutoConfiguration @ComponentScan
异常相关的注解:
@RestControllerAdvice ,@ExceptionHandler 用于同一异常捕获
配置类相关的注解:
@Configurantion 声明配置类
@Bean 代替xml配置方式,生成一个bean对象
@CommponentScan 用于对Commponent类型进行扫描

在这里插入图片描述

🦓SpringBoot自动装配的实现原理

springboot项目启动时,首先会对appcation.yml文件和pom.xml文件进行扫描,获取到项目中使用的第三方组件,然后会读取Spring.factories中的Spring支持的所有配置类,最后再筛选加载项目中使用到的组件配置类。
@SpringBootApplication下的
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

Canvas笔记04:绘制九大基本图形的方法,重头戏是贝塞尔曲线

hello&#xff0c;我是贝格前端工场&#xff0c;最近在学习canvas&#xff0c;分享一些canvas的一些知识点笔记&#xff0c;本期分享canvas绘制图形的知识&#xff0c;欢迎老铁们一同学习&#xff0c;欢迎关注&#xff0c;如有前端项目可以私信贝格。 Canvas是HTML5中的一个绘…

ROS2学习(七) Foxy版本ros2替换中间件。

在ros2使用的过程中&#xff0c;一开始选用的foxy版本&#xff0c;后来发现&#xff0c;foxy版本的ros2有很多问题。一个是foxy版本已经停止维护了。另一个问题是这个版本有很多bug, 后续的版本在功能实现上做了很大的改动&#xff0c;甚至说进行了重写。修复的一些问题&#x…

【Flink网络传输】ShuffleMaster与ShuffleEnvironment创建细节与提供的能力

文章目录 一. Taskmanager之间传递数据细节二. ShuffleService的设计与实现三. 在JobMaster中创建ShuffleMaster四. 在TaskManager中创建ShuffleEnvironment五. 基于ShuffleEnvironment创建ResultPartition1. 在task启动时创建ResultPartition2. ResultPartition的创建与对数据…

WSL2安装+深度学习环境配置

WSL2安装深度学习环境配置 1 安装WSL22 配置深度学习环境1.1 设置用户名、密码1.2 安装cuda修改WSL安装路径 1.3 安装Anaconda 参考&#xff1a;搭建Windows Linux子系统&#xff08;WSL2&#xff09;CUDA环境 参考&#xff1a;深度学习环境配置 WindowsWSL2 1 安装WSL2 WSL …

java-springboot 源码 01

01.springboot 是一个启动器 先安装maven&#xff0c;按照网上的流程来。主要是安装完成后&#xff0c;要修改conf目录下的setting.xml文件。 添加&#xff1a;阿里云镜像 <mirror><id>aliyunmaven</id><mirrorOf>*</mirrorOf><name>ali…

判断连续数据同意特征的方法:插旗法

bool isMonotonic(int* nums, int numsSize) {int flag 2;for (int i 1; i < numsSize; i) {if (nums[i-1] > nums[i]) {if (flag 0)return false;flag 1;}else if (nums[i-1] < nums[i]) {if (flag 1)return false;flag 0;}}return true; }此代码较为简单&…

【Python】新手入门(8):什么是迭代?迭代的作用是什么?

【Python】新手入门&#xff08;8&#xff09;&#xff1a;什么是迭代&#xff1f;迭代有什么应用&#xff1f; &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】…

《时代教育》是什么级别的期刊?是正规期刊吗?能评职称吗?

问题解答 问&#xff1a;《时代教育》杂志是正规刊物吗&#xff1f; 答&#xff1a;是的&#xff0c;国家新闻出版总署正式备案的期刊 问&#xff1a;《时代教育》是什么级别刊物&#xff1f; 答&#xff1a;省级 主管单位&#xff1a;成都日报报业集团 主办单位&#x…

<C++>【继承篇】

​ ✨前言✨ &#x1f393;作者&#xff1a;【 教主 】 &#x1f4dc;文章推荐&#xff1a; ☕博主水平有限&#xff0c;如有错误&#xff0c;恳请斧正。 &#x1f4cc;机会总是留给有准备的人&#xff0c;越努力&#xff0c;越幸运&#xff01; &#x1f4a6;导航助手&#x1…

主题乐园如何让新客变熟客,让游客变“留客”?

群硕跨越时间结识了一位爱讲故事的父亲&#xff0c;他汇集了一群幻想工程师&#xff0c;打算以故事为基础&#xff0c;建造一个梦幻的主题乐园。 这个乐园后来成为全球游客最多、收入最高的乐园之一&#xff0c;不仅在2023财年创下了近90亿&#xff08;美元&#xff09;的营收…

软件测试必学的16个高频数据库操作及命令

数据库作为软件系统数据的主要存取与操作中心&#xff0c;广泛应用于企业当中。在企业中常用的数据库管理系统有 ORACLE、MS SQL SERVER、MySQL等。其中以免费的 MySQL 最多&#xff0c;特别在中小型互联网公司里。 因此&#xff0c;本文的数据库操作是基于 MySQL 数据库系统下…

c# 二分查找(迭代与递归)

二分搜索被定义为一种在排序数组中使用的搜索算法&#xff0c;通过重复将搜索间隔一分为二。二分查找的思想是利用数组已排序的信息&#xff0c;将时间复杂度降低到O(log N)。 二分查找算法示例 何时在数据结构中应用二分查找的条件&#xff1a; 应用二分查找算法&#xff1a…

平台工程师的崛起:如何应对日益复杂的软件

平台工程只是 DevOps 专业化的另一个术语&#xff0c;还是有什么不同&#xff1f;事实可能介于两者之间。DevOps 及其相关的 DevXOps 风格具有浓厚的文化色彩&#xff0c;将各个团队置于中心位置。不幸的是&#xff0c;在许多地方&#xff0c;DevOps 导致了新的问题&#xff0c…

OpenAI 大声朗读出来

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

Kubernetes: 本地部署dashboard

本篇文章主要是介绍如何在本地部署kubernetes dashboard, 部署环境是mac m2 下载dashboard.yaml 官网release地址: kubernetes/dashboard/releases 本篇文章下载的是kubernetes-dashboard-v2.7.0的版本&#xff0c;通过wget命令下载到本地: wget https://raw.githubusercont…

成都正信:亲戚借了钱一直不还怎么委婉的说

在中国传统文化中&#xff0c;亲情关系往往被视为最为重要和敏感的部分。当亲戚间发生借贷时&#xff0c;若出现拖欠不还的情形&#xff0c;处理起来尤为棘手。面对这样的尴尬局面&#xff0c;采取委婉而有效的沟通方式至关重要。 张华最近就遇到了这样的困扰。他的表弟去年因急…

vue3中的生命周期有哪些和怎么使用?

目录 前言&#xff1a; 正文&#xff1a; 总结: 前言&#xff1a; Vue.js 3是Vue.js框架的最新主要版本&#xff0c;引入了一些重大的改变和增强。在Vue 3中&#xff0c;由于Composition API的引入&#xff0c;生命周期钩子被替换为生命周期函数。 正文&#xff1a; 以下是…

回调函数、回调地狱、解放方法Promise的用法

回调函数 回调函数的定义非常简单&#xff1a;一个函数被当做一个实参传入到另一个函数(外部函数)&#xff0c;并且这个函数在外部函数内被调用&#xff0c;用来完成某些任务的函数。就称为回调函数回调函数的两种写法(实现效果相同)&#xff1a; const text () > {docum…

Python算法题集_N 皇后

Python算法题集_N 皇后 题51&#xff1a;N 皇后1. 示例说明2. 题目解析- 题意分解- 优化思路- 测量工具 3. 代码展开1) 标准求解【规则遍历合理性回溯】2) 改进版一【线状态检测合理性回溯】3) 改进版二【单行矩阵回溯】 4. 最优算法5. 相关资源 本文为Python算法题集之一的代码…

文生视频Sora模型发布,是否引爆AI芯片热潮

文生视频Sora模型发布&#xff0c;是否引爆AI芯片热潮 1. 引言 在人工智能的历史长河中&#xff0c;每一次技术的飞跃都伴随着社会生产力的巨大变革。自2015年以来&#xff0c;深度学习技术的突破性进展&#xff0c;尤其是在自然语言处理、图像识别和机器学习等领域的成功应…