Java面试题之Spring相关问题(持续更新)

1.spring是如何简化开发的?

  • 基于POJO的轻量级和最小侵入编程;
  • 通过依赖注入和面向接口实现松耦合;
  • 基于切面(AOP)和惯例进行声明式编程;
  • 通过切面和模板减少样式代码,RedisTemplate,xxxTemplate。

1.1 基于POJO的轻量级和最小侵入编程(IOC控制反转)

 POJO可以理解为Bean对象,那么什么是Bean对象?javaBean是一种由java语言编写的可重用组件,类必须是具体和公共的,并且有无参构造器,通俗来讲:

  • 所有类必须被放在一个包中,
  • 类必须被声明为public,这样才能够被外部访问,
  • 类中的所有属性必须封装(使用private声明),
  • 封装的属性如果要被外部操作,必须要通过getter与setter方法,
  • 一个JavaBean中至少存在一个无参构造函数

 而当我们使用spring进行开发时,就是将bean交给spring容器进行管理,而不需任何干预。
 最小侵入式编程就是在编写代码时,整个spring框架不会对我们产生任何局限。

1.2 通过依赖注入和面向接口实现松耦合(IOC控制反转)

依赖注入
 以前在创建对象时,需要给对象属性进行赋值操作,无论是通过构造方法还是set方法,而现在交给容器管理之后,会通过DI(依赖注入)的方式替我们完成这个赋值操作;(IOC是实现思想,DI是实现方式)
面向接口
 面向接口可以轻松的实现业务扩展

1.3 基于切面(AOP)和惯例进行声明式编程(背过)

声明式事务
 声明式事务会帮助我们自动控制事务的回滚和提交

1.4 通过切面和模板减少样式代码(AOP面向切面)

 当需要做一些与业务无关的公共功能时,比如记录日志,事务管理,可以通过AOP的方式,将关键的核心代码切入到业务逻辑中去,而不需要去修改每一行代码。

2.对spring的理解?

 spring是一个开源框架,一个容器,还是一个生态,spring是一个最底层的服务支持,为spring全家桶提供了支撑,起到了基石的作用

3.spring的核心?

 spring是一个开源框架,为了简化企业开发而生,使得开发更加简洁,spring也是一个IOC和AOP的容器框架,包含并管理对象的声明周期,spring容器中通过一些列的map结构进行存储。

4.spring的事务传播机制

4.1 spring对事务的支持

 事务在逻辑上是一组操作,要么执行,要不都不执行。spring支持2种事务,分别是编程式事务声明式事务
 编程式事务是指将事务管理代码嵌入嵌入到业务代码中,来控制事务的提交和回滚。编程式事务管理的粒度可以精确到代码块级别。
 声明式事务将事务管理代码从业务方法中抽离了出来,以声明式的方式来实现事务管理,更容易更好用,但是对事务的管理粒度是方法级别。

4.2 spring事务传播机制

 当事务方法被另外一个事务方法调用时,必须指定事务应该如何传播。共有7种事务传播行为,其中常用的有2种:PROPAGATION_REQUIRED(默认事务传播机制)和PROPAGATION_REQUIRES_NEW 。

  • PROPAGATION_REQUIRED:当使用REQUIRED 时,方法b会加入到当前存在的事务中,如果当前没有事务则b开启一个新的事务

 例如在a()中调用b(),会首先判断a()上有没有事务,如果a()是事务方法,b()就用a里边的事务即可,也就是b()方法会加入a的事务,无论a还是b发生异常,都会导致整个事务回滚;

class A{@Transactionalpublic void a(){System.out.println("执行方法a()");b();}@Transactional(propagation = Propagation.REQUIRED)public void b(){System.out.println("执行方法b()");} 
}

 如果a()不是事务方法,b()自己新建一个事务,此时仅当b方法发生异常时事务回滚,且仅仅b的事务回滚,a不受影响。

class A{public void a(){System.out.println("执行方法a()");b();}@Transactional(propagation = Propagation.REQUIRED)public void b(){System.out.println("执行方法b()");} 
}
  • PROPAGATION_REQUIRES_NEW:当使用REQUIRES_NEW时,无论当前事务是否存在,方法b()都将启动一个新事务,这意味着2个事务是相互独立的。
     无论a()是否是事务方法,b()都会自己新建一个事务,即使a中的事务回滚,b中的事务仍然可以提交。
class A{//@Transactionalpublic void a(){System.out.println("执行方法a()");b();}@Transactional(propagation = Propagation.REQUIRES_NEW)public void b(){System.out.println("执行方法b()");} 
}

5.spring框架中单例Bean是线程安全的吗?

 不是,Spring框架中的单例bean不是线程安全的。spring 中的 bean 默认是单例模式,spring 框架并没有对单例 bean 进行多线程的封装处理。实际上大部分时候 spring bean 无状态的(比如 dao 类),所以某种程度上来说 bean 也是安全的,但如果 bean 有状态的话(比如 view model 对象),那就要开发者自己去保证线程安全了。最简单的就是改变 bean 的作用域,把“singleton”变更为“prototype”,这样请求 bean 相当于 new Bean()了,所以就可以保证线程安全了。
 多线程场景下,多个线程对这个单例Bean的成员变量并不存在资源的竞争,因为ThreadLocal为每个线程保存线程私有的数据。这是一种以空间换时间的方式。
 也可以通过加锁的方法来解决线程安全,这种以时间换空间的场景在高并发场景下显然是不实际的。

  • 有状态就是有数据存储功能(比如成员变量读写)。
  • 无状态就是不会保存数据。

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

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

相关文章

Python初学者必知的50个基础问题与解答

以下是一些常见的Python基础学习问题及其答案,希望对大家有所帮助: Python是什么类型的编程语言? Python是一种通用、高级、解释型的编程语言. Python中如何注释代码? 使用#符号添加单行注释,或使用三引号(""")添加多行注释.…

基于RBAC的权限管理的理论实现和权限管理的实现

权限管理的理论 首先需要两个页面支持,分别是角色管理和员工管理,其中角色管理对应的是角色和权限的配合,员工管理则是将登录的员工账号和员工所处的角色进行对应,即通过新增角色这个概念,让权限和员工并不直接关联&a…

Error creating bean with name ‘formContentFilter‘ defined in class path

问题描述 运行之前能正常的项目出现以上报错,提示创建“formContentFilter”时错误;org.springframework.boot版本2.4.8 org.springframework.beans.factory.BeanCreationException. Message: Error creating bean with name formContentFilter define…

202428读书笔记|《风吹哪页读哪页》——答案在路上,自由在风里,身处井隅,心向璀璨

202428读书笔记|《风吹哪页读哪页》——答案在路上,自由在风里,身处井隅,心向璀璨 文前篇章一 三餐四季篇章二 山水一程篇章三 心之安处篇章四 通关时刻篇章五 瞬间长大 《风吹哪页读哪页》飞扬文室编著,有很多非常经典又惊艳的句…

[hgame 2024 week1] crypto/pwn/reverse

第1周是入门题,作了3项的454道 Crypto 奇怪的图片 好像是个misc走错门了,给了一个程序和一堆图片,程序很长,但是看起来并不复杂 先用随机数生成一个图,和一个key(两个图),然后依次给这个图画上flag前i个字符,比如第1张是h,第2张是hg,依次类推.并且生成的图片名字是随机的,时…

4款AI写作软件推荐,让文章撰写更加轻松! #学习方法#知识分享

国外ChatGPT爆火,AI写作在国内也引起不小的瞩目,目前国内的AI写作工具少说也有几十上百个,要在这么多AI写作中找出适合自己的工具,一个一个尝试是不太现实的,所以今天就给大家推荐一些款AI写作工具。帮助你少走弯路&am…

【洛谷题解】P1051 [NOIP2005 提高组] 谁拿了最多奖学金

题目链接:[NOIP2005 提高组] 谁拿了最多奖学金 - 洛谷 题目难度:普及- 涉及知识点:判断条件,累加 题意: 分析:直接统计,判断条件,输出即可(水) AC代码&am…

Stable Diffusion 绘画入门教程(webui)

文章目录 一、前言二、做出的效果三、SD使用流程1、大模型2、关键字3、调参数 一、前言 随着mj和sd绘画软件发布之后,AI绘画开始爆火,很多小伙伴已经挖掘出很多的玩法,哪怕最基础的AI美女、AI壁纸、真人漫改等等都赚的盆满钵满,当…

【Flink】FlinkSQL读取hive数据(批量)

一、简介: Hive在整个数仓中扮演了非常重要的一环,我们可以使用FlinkSQL实现对hive数据的读取,方便后续的操作,本次例子为Flink1.13.6版本 二、依赖jar包准备: 官网地址如下: Overview | Apache Flink 1、我们需要准备相关的jar包到Flink安装目录的lib目录下,我们需…

LeetCode 2744.最大字符串配对数目

给你一个下标从 0 开始的数组 words &#xff0c;数组中包含 互不相同 的字符串。 如果字符串 words[i] 与字符串 words[j] 满足以下条件&#xff0c;我们称它们可以匹配&#xff1a; 字符串 words[i] 等于 words[j] 的反转字符串。 0 < i < j < words.length 请你返…

NC文件不规则裁剪(利用shp文件裁剪)(三)

文章目录 前言实例数据代码部分需要的库加载文件写入地理信息裁剪NC结果 完整代码奉上 前言 Hello大家好呀&#xff0c;最近正好需要用到多个SHP去裁剪NC&#xff0c;按照我以前的两种办法&#xff08;办法1和办法2&#xff09;操作的话&#xff0c;我自己都会破防&#xff0c…

Halcon中打开摄像机

&#xff08;带货广告&#xff1a;需要该套测试设备或者工业相机的及其相关产品的&#xff0c;请私聊我&#xff09; 1、相机说明 使用Basler相机&#xff0c; 2、打开Halcon助手 3、检测相机 4、连接摄像机和采集画面 5、自动生成代码 生成代码后&#xff0c;保存工程到本…

用java整理所有磁盘上的图片/文档到我们指定的磁盘下文件里面,并删除原来的路径下的图片

图片 package com.lpc.utils;import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.nio.file.StandardCopyOption; import java.util.ArrayList; import java.util.List;public class ImageFinder {public static void main(String[] a…

FreeRtos任务调度

一.创建任务函数 xTaskCreate( (TaskFunction_t )start_task, /*要执行的函数&#xff0c;开始任务*/(const char* )"start_task", /*任务名字&#xff0c;建议个函数名一样*/(uint16_t )START_STK_SIZE, (void* …

【PX4-AutoPilot教程-TIPS】PX4控制无人机在Gazebo中飞行时由于视角跟随无人机在画面中心导致视角乱晃的解决方法

PX4控制无人机在Gazebo中飞行时由于视角跟随无人机在画面中心导致视角乱晃的解决方法 问题描述解决方法 问题描述 无人机在Gazebo中飞行时&#xff0c;无人机始终处于画面中央&#xff0c;会带着视角乱晃&#xff0c;在Gazebo中进行任何操作视角都无法固定。 观察Gazebo左侧Wo…

最全软件测试面试问题和回答,全文背熟不拿下offer算我输!

求职&#xff0c;类似于打仗&#xff0c;是一场挑战自己的战斗&#xff0c;也是一场跟用人单位的博弈&#xff0c;更是一场千人过独木桥的厮杀、混战。《孙子谋攻篇》中早就说了&#xff1a;"知己知彼&#xff0c;百战不殆&#xff1b;不知彼而知己&#xff0c;一胜一负&a…

Mac M2芯片配置PHP环境

Mac M2芯片配置PHP环境 1. XAMPP2. PHPBrew(PHP版本管理)安装php7.4.33版本 3. 直接使用homebrew 安装php环境参考 1. XAMPP 官网地址 https://www.apachefriends.org/ 安装 安装完成 web server打开后&#xff0c;在打开localhost 成功&#xff01; 2. PHPBrew(PHP版本管…

Web基础①HTTP协议

一.HTTP协议的定义 HTTP协议采用了请求/响应模型。客户端向服务器发送一个请求&#xff0c;请求头包含请求的方法、URL、协议版本、以及包含请求修饰符、客户信息和内容的类似于MIME的消息结构。 1.HTTP协议版本 &#xff08;1&#xff09;HTTP/0.9&#xff1a;已过时。只接…

C语言实现位数组(BitArray)

简介 所谓的位数组&#xff0c;主要是为了有效地利用内存空间而设计的一种存储数据的方式。在这种结构中一个整数在内存中用一位(1 bit)表示。这里所谓的表示就是如果整数存在&#xff0c;相应的二进制位就为1&#xff0c;否则为0。 在嵌入式裸机开发中&#xff0c;ram资源是…

单片机01天_stm32f407zg_创建新工程

创建“寄存器版工程” 1、创建工程文件夹 创建工程文件夹“Project”&#xff0c;内部包含文件夹“CMSIS”&&“USER”。 CMSIS&#xff1a;Cortex系列内核接口驱动文件。 USER&#xff1a;存放用户编写的程序文件。 “USER”文件夹内包含“Inc”&&“Src”…