Java面试题,Spring与SpringBoot相关问题

news2024/11/16 1:53:38

Spring与SpringBoot相关问题

  • 1、BeanFactory和ApplicationContext有什么区别?
  • 2、描述一下Spring Bean的生命周期
  • 3、Spring的几种Bean的作用域
  • 4、单例Bean是线程安全的吗?
  • 5、Spring框架用到了哪些设计模式
  • 6、Spring事务的实现方式、隔离级别、传播行为
  • 7、Spring事务什么时候会失效
  • 8、 依赖注入与bean装配
  • 9、SpringBoot、SpringMVC、Spring有什么区别
  • 10、SpringBoot的starter

1、BeanFactory和ApplicationContext有什么区别?

  1. ApplicationContext是BeanFactory的子接口,所以ApplicationContext提供了更完整的功能
  • 继承MessageSource,因此支持国际化
  • 统一的资源文件访问的方式
  • 提供在监听器中注册bean的事件
  • 同时加载多个配置文件
  • 载入多个上下文,使得每一个上下文都专注于一个特定的层次,比如应用的web层

ApplicationContext的使用实例
BeanFactory的使用实例

  1. 加载Bean的区别
  • BeanFactory采用的是延迟加载形式来注入Bean的,即只有在使用到某个Bean时(调用getBean()),才对该Bean进行加载实例化。这样,我们就不能发现一些存在的Spring的配置问题。如果Bean的某一个属性没有注入,BeanFactory加载后,直至第一次使用调用getBean方法才会抛出异常
  • ApplicationContext是在容器启动时,一次性创建了所有的Bean。这样,在容器启动时,我们就可以发现Spring中存在的配置错误,并且通过这样的预加载,可以确保当你需要的时候,就不用等待,因为它们已经创建好了。
  • 基于上述的区别,ApplicationContext相对于BeanFactory的唯一不足是占用内存空间,并且启动较慢。
  1. 创建方式的区别
  • BeanFactory通常以编程的方式被创建(命令式编程:命令“机器”如何去做事情(how),这样不管你想要的是什么(what),它都会按照你的命令实现。)
  • ApplicationContext还能以声明的方式创建(·声明式编程:告诉“机器”你想要的是什么(what),让机器想出如何去做(how)。)
  1. BeanPostProcessor、BeanFactoryPostProcessor的使用

ApplicationContext和BeanFactory都支持BeanPostProcessor、BeanFactoryPostProcessor的使用,但是两者之间的区别是ApplicationContext可以自动注册,BeanFactory需要手动注册

2、描述一下Spring Bean的生命周期

  1. 实例化普通对象
  • 解析类得到BeanDefinition,即通过ComponentScan(“路径”)扫描指定路径,找到需要注册的类并解析类,然后就定义Bean
  • 如果有多个构造方法,则要推断构造方法
  • 确定好构造方法后,进行实例化得到一个普通对象
  1. 依赖注入
  • 对对象中的加了@Autowired注解的属性进行依赖注入
  • 回调Aware方法,比如BeanNameAware、BeanFactoryAware(参考文章)
  1. 初始化前中后方法
  • 前:调用BeanPostProcessor的初始化前的方法(感觉是AOP)(参考文章)
  • 中:调用初始化方法(执行所有方法)
  • 后:调用BeanPostProcessor的初始化后的方法(感觉是AOP)
    注意:BeanPostProcessor也就是Bean的后置处理,是在完成依赖注入后,即Bean实例化后
  1. 创建、使用、销毁
  • 如果当前创建的bean是单例的则会把bean放入单例池
  • 使用Bean
  • Spring容器关闭时调用DisposableBean中的destroy()方法

3、Spring的几种Bean的作用域

  • singleton:默认,每个容器中只有一个bean的实例
  • prototype:为每一个bean请求提供一个实例
  • request:bean被定义为在每个HTTP请求中创建一个单例对象,也就是说不同HTTP请求有不同单例对象,同一HTTP使用相同单例对象
  • session:与request范围类似,确保每个session中有一个bean的实例,在session过期后,bean会随之失效
  • application:bean被定义为在ServletContext的生命周期中复用一个单例对象
  • websocket:bean被定义在websocket的生命周期中复用一个单例对象

4、单例Bean是线程安全的吗?

  1. Spring中的Bean默认是单例模式的,框架并没有对bean进行多线程的封装处理,即线程不安全
  2. 如果Bean是有状态的,那就需要开发人员自己来进行线程安全的保证,最简单的办法就是改变bean的作用域,把singleton改为prototype,这样每次请求Bean就相当于是new Bean(),这样就可以保证线程的安全了。
  • 有状态就是有数据存储功能
  • 无状态就是不会保存数据
  1. controller、service、dao层本身并不是线程安全的,如果只是调用里面的方法,而且多线程调用一个实例的方法,会在内存中复制变量,这是自己的线程的工作内存,是安全的。
  2. 不要在bean中声明任何有状态的实例变量或类变量,如果必须如此,那么就使用ThreadLocal把变量变为线程私有的。如果bean的实例变量或类变量需要在多个线程之间共享,那么就只能使用synchronized、lock等这些实现线程同步的方法了。

5、Spring框架用到了哪些设计模式

  1. 单例模式:在Spring中最明显的使用场景是在配置文件中配置注册bean对象的时候【设置scope的值为singleton】
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://www.springframework.org/schema/beans 
 http://www.springframework.org/schema/beans/spring-beans.xsd">
 <bean class="com.dpb.pojo.User" id="user" scope="singleton">
  <property name="name" value="波波烤鸭"></property>
 </bean>
</beans>
  1. 原型模式:在Spring中最明显的使用场景是在配置文件中配置注册bean对象的时候【设置scope的值为prototype】
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://www.springframework.org/schema/beans 
 http://www.springframework.org/schema/beans/spring-beans.xsd">
 <bean class="com.dpb.pojo.User" id="user" scope="prototype">
  <property name="name" value="波波烤鸭"></property>
 </bean>
</beans>
  1. 模板模式
  • 核心是父类定义好流程,然后将流程中需要子类实现的方法就抽象化留给子类实现,Spring中JDBCTemplate就是这样的实现。例如,我们知道JDBC的步骤是固定:加载驱动、获取连接通道、构建sql语句、执行sql语句、关闭资源。
  • 在这些步骤中第3步和第4步是不确定的,所以就留给客户实现,而我们实际使用JDBCTemplate的时候也确实是只需要构建SQL就可以了。这就是典型的模板模式。
    在这里插入图片描述
  1. 观察者模式
  • 观察者模式定义的是对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。使用比较场景是在监听器中,而Spring中Observer模式常用的地方也是listener的实现。如ApplicationListener.
    在这里插入图片描述
  1. 简单工厂模式
  • 简单工厂模式就是通过工厂根据传递进来的参数决定产生哪个对象。Spring中我们通过getBean方法获取对象的时候根据id或者name获取就是简单工厂模式了。
//ApplicationContext这里,一旦读取了bean.xml,那么Spring容器中的所有bean都被实例化了,即在bean.xml中的所有bean都被创建了,并且所有bean都执行了无参构造方法
ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
//getBean : 参数即为spring配置文件中bean的id;
//就是将容器中“hello”这个JavaBean拿出来,注入到Hello hello中;
Hello hello = (Hello) context.getBean("hello");
hello.show();
  1. 工厂方法模式
  • 在Spring中我们一般是将Bean的实例化直接交给容器去管理的,实现了使用和创建的分离,这这时候容器直接管理对象
  • 还有一种情况是,bean的创建过程我们交给一个工厂去实现,而Spring容器管理这个工厂
  • 在Spring中有两种实现一种是静态工厂方法模式,另一种是动态工厂方法模式
  1. 适配器模式
  • 将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作,这就是适配器模式。
  1. 装饰者模式
  • 装饰者模式又称为包装模式(Wrapper),作用是用来动态的为一个对象增加新的功能。装饰模式是一种用于代替继承的技术,无须通过继承增加子类就能扩展对象的新功能。使用对象的关联关系代替继承关系,更加灵活,同时避免类型体系的快速膨胀。 spring中用到的包装器模式在类名上有两种表现:一种是类名中含有Wrapper,另一种是类名中含有Decorator。基本上都是动态地给一个对象添加一些额外的职责。 具体的使用在Spring session框架中的
  • SessionRepositoryRequestWrapper使用包装模式对原生的request的功能进行增强,可以将session中的数据和分布式数据库进行同步,这样即使当前tomcat崩溃,session中的数据也不会丢失。
  1. 代理模式
  • 代理模式应该是大家非常熟悉的设计模式了,在Spring中AOP的实现中代理模式使用的很彻底.
  1. 策略模式
  • 策略模式对应于解决某一个问题的一个算法族,允许用户从该算法族中任选一个算法解决某一问题,同时可以方便的更换算法或者增加新的算法。并且由客户端决定调用哪个算法,spring中在实例化对象的时候用到Strategy模式。
  1. 责任链默认
  • AOP中的拦截器链
  1. 委托者模式
  • DelegatingFilterProxy,整合Shiro,SpringSecurity的时候都有用到。

6、Spring事务的实现方式、隔离级别、传播行为

  1. Spring事务的实现方式
  • spring的事务是对数据库的事务的封装,最后本质的实现还是在数据库,假如数据库不支持事务的话,spring的事务是没有作用的. .数据库的事务说简单就只有开启,回滚和关闭,spring对数据库事务的包装,原理就是拿一个数据连接,根据spring的事务配置,操作这个数据连接对数据库进行事务开启,回滚或关闭操作.但是spring除了实现这些,还配合spring的传播行为对事务进行了更广泛的管理.其实这里还有个重要的点,那就是事务中涉及的隔离级别,以及spring如何对数据库的隔离级别进行封装.事务与隔离级别放在一起理解会更好些.
  • Spring事务的两种使用方式:编程式和申明式,@Transactional注解就是申明式的。
  • 当然针对哪些异常回滚事务是可以配置的,可以利用@Transactional注解中的rollbackFor属性进行配置,默认情况下会对RuntimeException和Error回滚
  1. Spring事务的隔离级别
    在这里插入图片描述
  2. Spring事务的传播行为
    在这里插入图片描述

7、Spring事务什么时候会失效

  1. Spring事务的原理是AOP,进行了切面增强,那么失效的根本原因是这个AOP不起作用了,常见情况如下几种:
  • 发生自调用,类里面使用this调用本类的方法,此时这个this对象不是代理类,而是UserService对象本身。(即放入Map<beanName,bean对象>的不是代理对象,而是普通对象
    -方法不是public的,因为@Transactional只能用于public的方法上,否则事务会失效。如果要用在非public方法上,可以开启AspectJ代理模式。(这是因为事务基于AOP,AOP基于继承,如果使用的是private,那么就无法继承这个方法,就会产生上述问题
  • 数据库不支持事务
  • 没有被Spring管理
  • 异常被吃掉,导致事务不会回滚(或者抛出的异常没有被定义,默认为RuntimeException)

8、 依赖注入与bean装配

依赖注入是什么?
当某个角色(可能是一个Java实例,调用者)需要另一个角色(另一个Java实例,被调用者)的协助时,在 传统的程序设计过程中,通常由调用者来创建被调用者的实例。但在Spring里,创建被调用者的工作不再由调用者来完成,因此称为控制反转;创建被调用者 实例的工作通常由Spring容器来完成,然后注入调用者,因此也称为依赖注入。

  • 其实无论是在Spring容器创建People的Bean,还是在主程序中调用People这个Bean都是涉及依赖注入的。例如在创建People的Bean,我需要获取dog和cat的Bean,那就为People的cat和dog属性进行依赖注入cat和dog的Bean。在主方法main中调用People,那也得向People people对象进行依赖注入。

装配是什么?
Bean的装配可以理解为依赖注入,Bean的装配方式,即Bean的依赖注入方式。举个例子,People有两个属性dog和cat,那么就需要将dog和cat两个bean注入到People中。

Spring中bean有三种装配机制
装配方式1:在xml中显式装配

<!--在xml中显式配置-->
	<!--csBean类有两个属性:title和author-->
    <bean name="cdBean" class="com.my.spring.bean.CDBean">
        <property name="title" value="The World!!"/>
        <property name="author" value="Mr.D"/>
    </bean>
    
     <!--csPlayer类有一个属性:cdBean-->
     <!--对csPlayer的属性csBean进行依赖注入,称为Bean装配,或者依赖关系注入-->
    <bean name="cdPlayer" class="com.my.spring.service.impl.CDPlayerImpl">
        <property name="cdBean" ref="cdBean"/>
    </bean>

装配方式2:在java中显式装配:都需要在Config配置类重写

//1. 注册Bean

/*
	@Configuration注解的作用:声明一个类为配置类,用于取代bean.xml配置文件注册bean对象。
	@Configuration(启动容器) 等同于spring的配置文件xml里的<beans>标签;
*/
@Configuration 	
class Config {
    @Bean	//@Bean(注册Bean) 等同于spring的配置文件xml里面的<bean>标签。
    public Seat seat(){ return new Seat();}
}

//2. 获取Bean
	@Bean	//通过set方法注入bean
    public Car car(){
        Car car = new Car();
        car.setSeat(seat());
        car.setEngine(engine());
        car.setWheel(wheel());
        return car;
    }
	@Bean	//通过构造器方法获取
    public Car anotherCar(Wheel wheel, Seat seat, Engine engine){
        Car car = new Car();
        car.setSeat(seat);
        car.setEngine(engine);
        car.setWheel(wheel);
        return car;
    }

装配方式3:隐式的bean发现机制和自动装配

  1. 显示装配与自动装配的区别
    显式装配:直接指定依赖项的名称,非常明显和确定,所以称之为显式装配
    自动装配:由Spring容器自动的将符合指定类型或指定名称的依赖项注入到bean的属性中

9、SpringBoot、SpringMVC、Spring有什么区别

  1. Spring
    Spring是一个IOC容器,用来管理Bean。
    Spring提供AOP机制弥补OOP代码重复问题

  2. SpringMVC
    SpringMVC是Spring对web框架的一个解决方法,提供了一个总的前端控制器Servlet,用来接收请求.

  3. SpringBoot
    SprintBoot是Spring提供的一个快速开发工具包,让程序员更方便、更快死的开发Spring+SpringMVC框架。

10、SpringBoot的starter

简述starter

  • 在使用spring+springMVC的时候,如果需要引入mybatis等框架,需要到xml定义mybatis需要的bean,这样太麻烦了,于是就出现了starter。
  • starter就是定义一个starter的jar包,写一个@Configuration配置类,将这些bean定义在里面,然后在starter包的META-IF/spring.factories中写该配置类,springboot会按照约定来加载配置类
  • 开发人员只需要将相应的starter包依赖导入进应用,进行相应的属性配置(yml文件),就可以直接进行代码开发,使用对应的功能了,比如mybatis-spring-starter,spring-boot-starter-redis

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

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

相关文章

Lesson4--栈和队列

目录 1.栈 1.1栈的概念及结构 1.2栈的实现 初始化栈 销毁栈 栈的扩容 入栈 出栈 获取栈顶元素 获取栈中有效元素个数 判空 程序代码如下 Stack.h Stack.c test.c 2.队列 2.1队列的概念及结构 ​2.2队列的实现 初始化队列 队尾入队列 队头出队列 获取队列头部元素 获取…

二、pyhon基础语法篇(黑马程序猿-python学习记录)

黑马程序猿的python学习视频&#xff1a;https://www.bilibili.com/video/BV1qW4y1a7fU/ 目录 一 、print 1. end 2. \t对齐 二、字面量 1. 字面量的含义 2. 常见的字面量类型 3. 如何基于print语句完成各类字面量的输出 三、 注释的分类 1. 单行注释 2. 多行注释 3. 注释的…

多进程|基于非阻塞调用的轮询检测方案|进程等待|重新理解挂起|Linux OS

说在前面 今天给大家带来操作系统中进程等待的概念&#xff0c;我们学习的操作系统是Linux操作系统。 我们今天主要的目标就是认识wait和waitpid这两个系统调用。 前言 那么这里博主先安利一下一些干货满满的专栏啦&#xff01; 手撕数据结构https://blog.csdn.net/yu_cbl…

nacos源码分析==服务订阅-服务端推送被订阅者最新信息给订阅者

上一篇讲到客户端发送请求到服务端进行服务注册&#xff0c;注册后&#xff0c;服务端会发出两个事件&#xff0c;第一个事件会触发另一个ServiceChangedEvent&#xff0c;这个事件被com.alibaba.nacos.naming.push.v2.NamingSubscriberServiceV2Impl#onEvent 监听&#xff0c…

16. 条件控制

总体来说&#xff0c;条件控制的效果类似c/c/c#/java中的&#xff0c;只不过在语法格式的层面上存在一定的差异。 1. if条件语法格式 if condition_1:...elif condition_2:...else:...1、python 中用 elif 代替了 c/c中的 else if&#xff0c;所以if语句的关键字为&#xff1a…

高性能排序函数实现方案

如C语言的qsort()、Java的Collections.sort()&#xff0c;这些排序函数如何实现&#xff1f; 1 合适的排序算法&#xff1f; 线性排序算法的时间复杂度较低&#xff0c;适用场景特殊&#xff0c;通用排序函数不能选择。 小规模数据排序&#xff0c;可选时间复杂度O(n^2)算法大…

【算法】滑动窗口

目录1.概述2.算法框架3.应用本文参考&#xff1a; LABULADONG 的算法网站 1.概述 &#xff08;1&#xff09;滑动窗口可以用以解决数组/字符串的子元素相关问题&#xff0c;并且可以将嵌套的循环问题&#xff0c;转换为单循环问题&#xff0c;从而降低时间复杂度。故滑动窗口算…

【数据分析】(task5)数据建模及模型评估

note 文章目录note一、建立模型二、模型评估2.1 交叉验证2.2 混淆矩阵/recall/accuracy/F12.3 ROC曲线三、Pyspark进行基础模型预测时间安排Reference一、建立模型 下载sklearn的命令pip install scikit-learn。 from sklearn.model_selection import train_test_split impor…

ARP渗透与攻防(二)之断网攻击

ARP断网攻击 系列文章 ARP渗透与攻防(一)之ARP原理 1.环境准备 kali 作为ARP攻击机&#xff0c;IP地址&#xff1a;192.168.110.26 MAC地址&#xff1a;00:0c:29:fc:66:46 win10 作为被攻击方&#xff0c;IP地址&#xff1a;192.168.110.12 MAC地址&#xff1a;1c:69:7a:a…

Tkinter的Entry与Text

Tkinter界面设计之输入控件Entry以及文本框控件Text。 目录 一、放置控件 1. pack()函数 2. place()函数 3. grid()函数 二、简单控件 1. Entry输入控件 1.1 tk.StringVar()函数&#xff1a;接收一个字符串 1.2 tk.Entry()函数&#xff1a;设置一个输入控件E 2. Text文…

CMake多文件编译

之前学习ceres-solver中的3d相关的源码的时候&#xff0c;发现对于CMake多文件工程编译中对于CMakeLists.txt的编写和处理的理解运用还是比较模糊&#xff0c;这里整理梳理一下对于不同文件夹数量如何使用。 参考文章&#xff1a; CMake使用详解二&#xff08;多文件编译&…

maya常用操作

1&#xff1a;重置工作区。2&#xff1a;切换视图。按空格切换视图。3&#xff1a;未选中状态&#xff0c;按shift&#xff0c;再点右键&#xff0c;可以打开交互式创建。这样可以在栅格上创建想要的大小。不选中交互式创建的话&#xff0c;创建的是默认未知。默认未知为正中间…

linux系统中利用QT实现车牌识别的方法

大家好&#xff0c;今天主要和大家分享一下&#xff0c;如何利用QT实现车牌识别的方法。 目录 第一&#xff1a;车牌识别基本简介 第二&#xff1a;车牌识别产品申请 第三&#xff1a;百度车牌识别API接口 第四&#xff1a;车牌识别综合测试 第一&#xff1a;车牌识别基本简…

Scala快速入门

Scala简介 Scala是一门现代的多范式编程语言&#xff0c;平滑地集成了面向对象和函数式语言的特性。Scala运行于Java平台&#xff08;JVM&#xff0c;Java 虚拟机&#xff09;上&#xff0c;并兼容现有的Java程序&#xff0c;Scala代码可以调用Java方法&#xff0c;访问Java字…

ArcGIS Pro脚本工具(17)——生成多分式标注

​朋友们&#xff0c;你们知道ArcGIS里面分式标注的四种写法么&#xff1f; 放错图了&#xff0c;是这个 分式标注的四种形式我们可以把这类叫分式标注&#xff0c;网上也有博主分享过如何在ArcGIS中制作这类标注&#xff0c;但我觉得仍有一些不足。 一是基本都使用VB编写&…

中文问题相似度挑战赛

赛题概要 请本赛题排行榜前10位的队伍&#xff0c;通过作品说明提交源代码&#xff0c;模型以及说明文档&#xff0c;若文件过大&#xff0c;可发送至官网邮箱AICompetitioniflytek.com, 若截止时间内为提交&#xff0c;官方会通过电话联系相关选手&#xff0c;若未接到通知或…

WPF作图神器Interactive DataDisplay的初步使用

文章目录安装初步使用安装 Interactive DataDisplay是一款比较优秀的C#绘图控件&#xff0c;尽管与一些商业控件还有不小的差距&#xff0c;关键是开源免费轻量。 在VS中安装控件十分简单&#xff0c;本测试基于Net Core5.0&#xff0c;在VS的菜单栏->工具->NuGet包管理…

HomeLab 常用工具一:filebrowser

前言在实际使用过程中&#xff0c;我们通常都有基于WEB 的文件操作需求&#xff08;例如从一台陌生设备上想打开看一下&#xff0c;图片等&#xff09;&#xff0c;和nextcloud 相比 filebrowser 更为轻巧也更为方便。一、filebrowser 安装这里基于docker 安装和使用&#xff0…

Prometheus 动态拉取监控服务

Prometheus 版本 2.41.0 平台统一监控的介绍和调研直观感受PromQL及其数据类型PromQL之选择器和运算符PromQL之函数Prometheus 配置身份认证Prometheus 动态拉取监控服务 我们在以前的实例中配置Prometheus 的target 都是手动配置&#xff0c;这在监控目标少的情况下还可以接受…

【基础】BMP格式

BMP格式位图 (BMP)简介格式1.1图和调色板的概念1.2 bmp文件格式1.2.1 位图文件头 14字节1.2.2 位图信息头 40字节1.2.3 调色板1.2.4 注意位图 (BMP)简介 BMP取自位图Bitmap的缩写&#xff0c;也称为DIB&#xff08;与设备无关的位图&#xff09;&#xff0c;是一种独立于显示器…