【java八股文】之Spring系列篇

news/2024/2/24 8:38:13/文章来源:https://blog.csdn.net/liguohuaty/article/details/135550257

【java八股文】之JVM基础篇-CSDN博客

【java八股文】之MYSQL基础篇-CSDN博客

【java八股文】之Redis基础篇-CSDN博客

【java八股文】之Spring系列篇-CSDN博客

【java八股文】之分布式系列篇-CSDN博客

【java八股文】之多线程篇-CSDN博客

【java八股文】之JVM基础篇-CSDN博客

【java八股文】之计算机网络系列篇-CSDN博客

1、你怎么理解Spring?

Spring是个轻量级的框架,简化了应用的开发程序,提高开发人员的系统维护性,不过配置消息比较繁琐,所以后面才出选了SpringBoot的框架。

Spring的核心组件 : Spring Core 、 Spring Context 、 Spring Beans

IOC是Bean的一个容器,Context是每个Bean之间依赖的关系。正是因为各种Bean建立的关系我们才构成了IOC容器为我们服务,而Core就是维护、建立和维护所需要的的工具。

2、Spring中的Bean 是线程安全的吗?

非安全的

  • 原型Bean

对于原型Bean,每次创建一个新对象,也就是线程之间并不存在Bean共享,自然是不会有线程安全的问题。

  • 单例Bean

对于单例Bean,所有线程都共享一个单例实例Bean,因此是存在资源的竞争。

如果单例Bean,是一个无状态Bean,也就是线程中的操作不会对Bean的成员执行查询以外的操作,那么这个单例Bean是线程安全的。比如Spring mvc 的 Controller、Service、Dao等,这些Bean大多是无状态的,只关注于方法本身。

但是如果Bean是有状态的 那就需要开发人员自己来进行线程安全的保证,最简单的办法就是改变bean的作用域 把 "singleton"改为’‘protopyte’ 这样每次请求Bean就相当于是 new Bean() 这样就可以保证线程的安全了。

  • 有状态就是有数据存储功能
  • 无状态就是不会保存数据 controller、service和dao层本身并不是线程安全的,只是如果只是调用里面的方法,而且多线程调用一个实例的方法,会在内存中复制变量,这是自己的线程的工作内存,是安全的。
  • 所以其实任何无状态单例都是线程安全的。


3、Spring单例,为什么controller、service和dao确能保证线程安全?


Spring中的Bean默认是单例模式的,框架并没有对bean进行多线程的封装处理。

实际上大部分时间Bean是无状态的(比如Dao) 所以说在某种程度上来说Bean其实是安全的。

4、什么是IOC和AOP,你知道他们的原理吗?

IOC:IOC就是控制反转,是一种思想而不是技术实现,A类对象中需要B类对象,传统是自己手动new就是主动控制,IoC思想就是交给IoC容器管理,不再自己手动new,容器管理好对象以及依赖关系,需要的时候从容器里拿就行。

IOC原理:就是在给每一个bean进行实例化后,都要对他的属性进行填充,大多数我们都是使用@Autowire直接的填充依赖注入的,在实例化和实例化后之间会调用一个MergedBeanDefinitionPostProcessor.postProcessMergedBeanDefinition一个寻找注入点的方法,然后在属性填充时候,首先是按照注入点的类型去寻找如果有多个选择@Qualifier注解寻找,如果还是有多个按照@Primary,@Priority,最后还是没有筛选出来一个唯一的注入就按照名字来查找。

AOP:是面向切面的编程,AOP就是可以将那些与业务不相关但是很多业务都要调用的代码抽取出来封装起来,减少重复代码,思想就是不侵入原有代码的情况下对功能进行增强。

AOP原理:SpringAOP是基于动态代理的,其中SpringAOP的底层的动态代理有两种方式,一种是对于实现接口的JDK Proxy方式,另外一种就是CgLib。

Aspect:表示切面,比如被@Aspect注解的类就是切面,可以在切面中去定义Pointcut、Advice等等。


Join point:表示连接点,表示一个程序在执行过程中的一个点,比如一个方法的执行,比如一个异常的处理,在Spring AOP中,一个连接点通常表示一个方法的执行。


Advice:表示通知,表示在一个特定连接点上所采取的动作。Advice分为不同的类型,后面详细讨论,在很多AOP框架中,包括Spring,会用Interceptor拦截器来实现Advice,并且在连接点周围维护一个Interceptor链。


Pointcut:表示切点,用来匹配一个或多个连接点,Advice与切点表达式是关联在一起的,Advice将会执行在和切点表达式所匹配的连接点上。


Introduction:可以使用@DeclareParents来给所匹配的类添加一个接口,并指定一个默认实现。


Target object:目标对象,被代理对象。


AOP proxy:表示代理工厂,用来创建代理对象的,在Spring Framework中,要么是JDK动态代理,要么是CGLIB代理。


Weaving:表示织入,表示创建代理对象的动作,这个动作可以发生在编译时期(比如Aspejctj),或者运行时,比如Spring AOP。

4、bean 的生命周期?

  • 首先通过扫描包路径,通过ASM技术获取到类的信息,封装成BeanDefintion注册到Spring容器当中(这个操作其实就是BeanFactory的后置处理器操作)
  • 然后就可以进行类的加载,进行类的实例化前操作、推断构造方法、实例化、实例化后、填充属性。(值得注意的是再实例化和实例化后之间有个BeanDefinction的后置处理器,这个后置处理器就是我们@Autowire的寻找注入点的迁前置操作。依赖注入就是再实例化后的操作)
  • 最后就进行执行Aware回调、初始化前、初始化、初始化后(代理逻辑)操作
  • 最后就是bean的销毁操作

5、Bean实例化的时候是如何解决循环依赖?

循环依赖就是在创建A实例的时候里面包含着B属性实例,所以这个时候就需要去创建B实例,而创建B实例过程中也包含着A实例。 这样A实例还在创建的过程当中,所以就导致A和B实例都创建不出来。

  • 一级缓存 就是我们所说的Bean存储的经过完整的生命周期的单例池
  • 二级缓存 缓存未经过完整的声明周期的Bean
  • 三级缓存 缓存的是ObjectFactory其实存储的是一个动态代理类的一个实现类的拉姆达表达式,执行这个拉姆达表达式就会生成这个类的代理类。

6、Bean实例化的三级缓存了解吗?

有了这三级缓存我们就来看一看,他是如何解决的。

如果出现了循环依赖的问题,我们在创建A的过程中,需要创建B。这个时候就需要将A放入三级缓存并且不会执行那个拉姆达表达式,所以这个时候需要去创建B在创建B时候需要去依赖A,就直接去三级缓存中查找,并且判断需不需要进行AOP处理,如果需要就执行那个拉姆达表达式得到代理对象,如果不需要就不需要执行,直接取出原始的对象。将取出的对象放入二级缓存中,因为这个时候A还未经过完整的生命周期所以不能放入一级缓存。这个时候其他需要依赖A对象的直接从二级缓存中去获取即可。当B创建完成,A继续执行生命周期,当A完成了属性的注入后,就可以放入一级缓存了。

7、SpringMVC的工作原理

  • 客户端(浏览器)发送请求,直接请求到 DispatcherServlet。
  • DispatcherServlet 根据请求信息调用并且找到对应的HandlerMapping,解析请求对应的 Handler。
  • 然后利用对应的适配处理器,并且调用处理器开始执行,执行过程中包括解析参数,返回ModelAndView
  • Model 是返回的数据对象,View 是个逻辑上的 View
  • ViewResolver 会根据逻辑 View 查找实际的 View。
  • DispaterServlet 把返回的 Model 传给 View(视图渲染)。

8d84fc309f764a90b5463a529bd7cc36.png
8、Spring的事务实现方式?事务隔离级别?事务传播机制?

spring事务是在启动类上加一个@Configuration 和 @EnableTransactionManagement注解,然后再Service的方法上面加一个@Transactional注解就可以了。

Spring使用的事务隔离级别默认是使用MySQL数据库的隔离级别。

事务的传播机制:

8.1 当前不存在事务

  • requiresd 新建一个事务
  • requires_new 新建一个事务
  • nested 新建一个事务
  • mandatory 抛异常

8.2 当前存在事务

  • requiresd 加入这个事务
  • requires_new 把当前事务挂起,然后新建一个事务
  • nested 记录一个SavePoint,创建一个事务作为当前事务的嵌套事务来运行外部主事务回滚的话,子事务也会回滚,而内部子事务可以单独回滚而不影响外部主事务和其他子事务。
  • mandatory 加入该事务
  • never 以非事务方式运行,如果当前存在事务,则抛出异常。

9、讲一下SpringBoot里面比较常用的注解?

@configuration

@handmapping

@getmapping

@postmapping

@EnableTransactionManagement

@mapperScaner

@commpoent

@requestBody

@restcontroller

10、MyBatis的 # 和 $ 有什么区别?

  • ${}是properties文件的变量占位符,用于标签属性值和SQL内部,比如${driver}会被替换成com.mysql.jdbc.Driver。
  • #{}是SQL的参数占位符,实际上会被替换成 ?

11、SpringBoot 是如何实现自动装配的?


@SpringBootApplication下有三个注解:

  • @SpringBootConfiguration:启用 SpringBoot 的配置类,相当于是Spring中的一个配置文件,比如说可以在这个类去注册bean,或者导入其他的配置类
  • @ComponentScan:用于扫描启动类包下面的所有类的注解信息,并且注册
  • @EnableAutoConfiguration:启用 SpringBoot 的自动配置机制,获取需要自动装配的所有配置类,读取所有的Start中的META-INF/spring.factories,按需加载到IOC容器中。

12、什么情况下会出现事务失效场景?

  • 数据库引擎不支持事务
  • 传播机制不支持事务,就是不以事务的情况运行
  • 没有配置事务管理器数据源
  • 没有被 Spring 管理
  • 方法不是 public 的 @Transactional 只能用于 public 的方法上,否则事务不会失效,如果要用在非 public 方法上,可以开启 AspectJ 代理模式。
  • 自身调用问题
  • 异常被捕获了
  • 异常的类型不匹配,默认是运行时的异常

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

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

相关文章

ES6(ECMAScript 6.0)

ES6 学习链接ES6什么是ES6?ECMAScript 和 JavaScript 的关系 ECMAScript各版本新增特性ES6 块级作用域 let 学习链接 ES6简介 ECMAScript简介及特性(科普!很详细!!!!) 20分钟上手ES…

OpenHarmony基于HDF简单驱动开发实例

OpenHarmony基于HDF简单驱动开发实例 背景 OpenHarmony-3.0-LTS qemu_small_system_demo liteos_a qemu 添加配置 device/qemu/arm_virt/liteos_a/hdf_config/device_info/device_info.hcs device_info 新增: sample_host :: host {hostName "sample…

Docker 配置国内镜像源加速

1. 国内镜像源总览 名称路径中国官方镜像https://registry.docker-cn.com网易163镜像http://hub-mirror.c.163.com中科大镜像https://docker.mirrors.ustc.edu.cn阿里云镜像https://[xxx].mirror.aliyuncs.com 2. 阿里云镜像源 地址:https://cr.console.aliyun.c…

基于Java SSM框架实现医院管理系统项目【项目源码】计算机毕业设计

基于java的SSM框架实现医院管理系统演示 SSM框架 当今流行的“SSM组合框架”是Spring SpringMVC MyBatis的缩写,受到很多的追捧,“组合SSM框架”是强强联手、各司其职、协调互补的团队精神。web项目的框架,通常更简单的数据源。Spring属于…

尼科彻斯定理----C语言

大家好我是Beilef许久未见了,小弟学校考试刚结束。这个过程懂的都懂。痛------ 文章目录 目录 文章目录 前言(一不好懂可以直接跳到二) 一、尼科彻斯定理是什么? 二、尼科彻斯定理解析 这是ai的回答 尼科彻斯定理(Nikomačs theor…

计算机网络 —— 数据链路层

数据链路层 3.1 数据链路层概述 数据链路层把网络层交下来的数据构成帧发送到链路上,以及把收到的帧数据取出并上交给网络层。链路层属于计算机网络的底层。数据链路层使用的信道主要由以下两种类型: 点对点通信。广播通信。 数据链路和帧 链路&…

京东年度数据报告-2023全年度笔记本十大热门品牌销量(销额)榜单

2023年度,在电脑办公市场整体销售下滑的环境下,笔记本市场的整体销售也不景气。 根据鲸参谋平台的数据显示,京东平台上笔记本的年度销量为650万,同比下滑约16%;销售额约为330亿,同比下滑约19%。同时&#…

基于ssm的实验室排课系统论文

摘 要 互联网发展至今,无论是其理论还是技术都已经成熟,而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播,搭配信息管理工具可以很好地为人们提供服务。针对信息管理混乱,出错率高,信息安全性差&#x…

【k8s】Kubernetes 声明式 API、命令式

1. 资源管理方式: 1>. 命令式对象管理∶直接使用命令去操作kubernetes资源 kubectl run nginx-pod --imagenginx:1.17.1 --port802>. 命令式对象配置∶通过命令配置和配置文件去操作kubernetes资源 kubectl create/patch -f nginx-pod.yaml3>. 声明式对…

CSS 选择器全攻略:从入门到精通(上)

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…

环境变量详细说明

Windows之系统环境变量 配置操作: 计算机→属性→高级系统设置→高级→环境变量 系统变量→新建:JAVA_HOME 变量值:C:\Program Files\Java\jdk1.8.0_121 系统变量→Path→编辑:在变量值最后输入 :%JAVA_HOME%\bin;%J…

Linux基础工具的使用(yum,vim,gcc,g++,gdb,make/makefile)【详解】

目录 linux软件包管理器-yum什么是软件包?查找软件包如何安装软件卸载软件 linux编辑器 - vimvim的基本概念vim模式之间的切换vim命令模式各命令汇总vim底行模式各命令汇总 Linux编译器 - gcc/ggcc/g的作用gcc/g选项预处理编译汇编链接静态库与动态库 Linux调试器 -…

【liunx】线程池+单例模式+STL,智能指针和线程安全+其他常见的各种锁+读者写者问题

线程池单例模式STL,智能指针和线程安全其他常见的各种锁读者写者问题 1.线程池2.线程安全的单例模式3.STL,智能指针和线程安全4.其他常见的各种锁4.读者写者问题 喜欢的点赞,收藏,关注一下把! 1.线程池 目前我们学了挂起等待锁、条件变量、信…

优雅设计之美:实现Vue应用程序的时尚布局

前言 页面布局是减少代码重复和创建可维护且具有专业外观的应用程序的基本模式。如果使用的是Nuxt,则可以提供开箱即用的优雅解决方案。然而,令人遗憾的是,在Vue中,这些问题并未得到官方文档的解决。 经过多次尝试,小…

设计模式-委托模式

设计模式专栏 模式介绍模式特点应用场景委托模式在GUI编程场景的应用代码示例Java实现委托模式Python实现委托模式 委托模式在spring中的应用 模式介绍 委托模式是一种软件设计模式,其中一个对象(委托对象)将某些操作委托给另一个对象&#…

ppt怎么录屏录音并且导出?好用录屏软件推荐

ppt已经成为了日常工作与学习中必不可少的工具,而ppt屏幕录制功能,可以方便用户将他人的演讲或视频中的内容记录下来,以便进一步学习与研究。录制ppt演示并将其导出为视频文件,可以帮助我们进行分享,但是很多人不知道p…

基于Python的汽车信息爬取与可视化分析系统

介绍 这款汽车信息网站是基于多项技术和框架设计的全面的汽车信息展示及查询系统。其中,采用了Python Django框架和Scrapy爬虫技术实现数据的抓取和处理,结合MySQL数据库进行数据存储和管理,利用Vue3、Element-Plus、ECharts以及Pinia等前端…

C++设计模式-- 2.代理模式 和 外观模式

文章目录 代理模式外观模式角色和职责代码演示一:代码演示二:外观模式适用场景 代理模式 代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合 或不能直接引用另一个对象,而代…

Spring高手之路-Spring事务失效的场景详解

目录 前言 Transactional 应用在非 public 修饰的方法上 同一个类中方法调用,导致Transactional失效 final、static方法 Transactional的用法不对 Transactional 注解属性 propagation 设置不当 Transactional注解属性 rollbackFor 设置错误 用错注解 异常…

控制网页的灰度显示

1.代码&#xff1a; 普通网页 <style>html {filter: grayscale(100%);}</style> 或是:webkit内核浏览器写法 <style>html {-webkit-filter: grayscale(100%)}</style> 2.说明&#xff1a; grayscale(amount) :进行灰度转换。 amount转换值的大小&…