Spring、SpringBoot常见面试题与答案

Spring

Spring Bean 的作用域有哪些?它的注册方式有几种?

  • Spring 容器中管理一个或多个 Bean,这些 Bean 的定义表示为 BeanDefinition 对象,具体包含以下重要信息:
    • Bean 的实际实现类;
    • Bean 的引用或者依赖项;
    • Bean 的作用范围;
      • singleton:单例(默认);
      • prototype:原型,每次调用bean都会创建新实例;
      • request:每次http请求都会创建新的bean;
      • session:同一个http session共享一个bean对象;
      • application:全局的web作用域。
  • 三种注册方式:XML配置、注解、API(实现指定接口)。

bean的生命周期是什么?

  • bean的初始化流程由容器\客户端(非懒加载\懒加载)调用 BeanFactory 的 getBean() 方法触发。以getBean()方法为入口,通过递归,一层一层地完成bean的创建和依赖注入,直到最后完成当前bean的创建;
    • getBean();
    • 调用bean的构造函数;
    • 依赖注入;
    • bean初始化前置方法;
    • bean初始化,主要执行afterPropertiesSet方法,dubbo的注册与发现都是以该方法为入口;
    • bean初始化后置方法,AOP代理对象在此处创建;
    • 使用bean;
    • 销毁bean(需要主动发起)。

Spring怎么解决循环依赖?

  • Spring的循环依赖的理论依据其实是基于Java的引用传递,当我们获取到对象的引用时,对象的field或则属性是可以延后设置的(但是构造器必须是在获取引用之前执行);
  • Spring通过三级缓存解决循环依赖问题:
    • singletonObjects:单例对象的cache;
    • earlySingletonObjects:提前暴光的单例对象的Cache;
    • singletonFactories:单例对象工厂的cache,可以用来创建半成品对象(只执行构造器,不填充属性);
  • Spring首先从一级缓存singletonObjects中获取,如果获取不到,并且对象正在创建中,就再从二级缓存earlySingletonObjects中获取,如果还是获取不到且允许singletonFactories通过getObject()获取,就从三级缓存singletonFactory.getObject()获取,如果获取到了则从singletonFactories中移除,并放入earlySingletonObjects中。其实也就是从三级缓存移动到了二级缓存。

Spring能否解决构造器的循环依赖?

  • 不能,例如“A的构造方法中依赖了B的实例对象,同时B的构造方法中依赖了A的实例对象”;
  • 因为加入singletonFactories三级缓存的前提是执行了构造器,所以构造器的循环依赖Spring无法解决。

BeanFactory与FactoryBean的区别是什么?

  • BeanFactory是Spring中IOC容器最顶层的接口,它定义了IOC容器的基本功能规范;
  • FactoryBean是工厂类接口,当你只是想简单的去构造Bean,并且绕过原有初始化的复杂流程时,可以通过实现FactoryBean来创建bean。Spring内部就有很多bean是通过FactoryBean来创建的,方便内部的使用。

JDK动态代理与CGLIB的区别是什么?

  • JDK Proxy 是 Java 语言自带的功能,无需通过加载第三方类实现;
  • Java 对 JDK Proxy 提供了稳定的支持,并且会持续的升级和更新 JDK Proxy,例如 Java 8 版本中的 JDK Proxy 性能相比于之前版本提升了很多;
  • JDK Proxy 是通过拦截器加反射的方式实现的;
  • JDK Proxy 只能代理继承接口的类;
  • JDK Proxy 实现和调用起来比较简单;
  • CGLib 是第三方提供的工具,基于 ASM 实现的,性能比较高;
  • CGLib 无需通过接口来实现,它是通过实现子类的方式来完成调用的。

Spring事务的传播属性有哪些?

  • 所谓Spring事务的传播属性,就是定义在存在多个事务同时存在的时候,Spring应该如何处理这些事务的行为。
常量名称常量解释
PROPAGATION_REQUIRED支持当前事务。如果当前有事务,则加入当前事务;如果当前没有事务,就新建一个事务。这是最常见的选择,也是 Spring 事务默认的传播属性。
PROPAGATION_REQUIRES_NEW新建事务。即使当前有事务,会额外新建一个事务,新建的事务和原事务相互独立,互不影响。
PROPAGATION_SUPPORTS支持当前事务,如果当前没有事务,就以非事务方式执行。
PROPAGATION_MANDATORY支持当前事务,如果当前没有事务,就抛出异常。
PROPAGATION_NOT_SUPPORTED以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
PROPAGATION_NEVER以非事务方式执行,如果当前存在事务,则抛出异常。
PROPAGATION_NESTED嵌套事务。将创建一个依赖于外层事务的子事务,子事务的提交与回滚由外层事务控制,但它无法影响外层事务。当外层事务提交或回滚时,子事务也会连带提交和回滚。

SpringBoot

SpringBoot与Spring的区别是什么?

  • Spring Boot 本质上是 Spring 框架的延伸和扩展,它的诞生是为了简化 Spring 框架初始搭建以及开发的过程,使用它可以不再依赖 Spring 应用程序中的 XML 配置,为更快、更高效的开发 Spring 提供更加有力的支持。
    • 更快速的构建能力:Spring Boot 提供了更多的 Starters 用于快速构建业务框架,Starters 可以理解为启动器,它包含了一系列可以集成到应用里面的依赖包,你可以一站式集成 Spring 及其他技术,而不需要到处找依赖包。
    • 起步依赖:在创建 Spring Boot 时可以直接勾选依赖模块,这样在项目初始化时就会把相关依赖直接添加到项目中,大大缩短了查询并添加依赖的时间;
    • 内嵌容器支持:Spring Boot 内嵌了 Tomcat、Jetty、Undertow 三种容器,其默认嵌入的容器是 Tomcat;
    • Actuator 监控:可以监控应用程序的运行状况,或者内存、线程池、Http 请求统计等。

SpringBoot约定优于配置的体现是什么?

  • Maven的目录结构:
    • 默认有resources文件夹存放配置文件;
    • 默认打包方式为jar。
  • 默认的配置文件:application.properties 或 application.yml 文件;
  • 默认通过 spring.profiles.active 属性来决定运行环境时的配置文件;
  • EnableAutoConfiguration 默认对于依赖的 starter 进行自动装载;
  • spring-boot-start-web 中默认包含 spring-mvc 相关依赖以及内置的 tomcat 容器,使得构建一个 web 应用更加简单。

SpringBoot 有几种读取配置文件内容的方法?

  • 注入Environment对象:通过Environment 的 getProperty() 方法读取指定配置 Key 的内容;
  • 使用@Value注解,实现单个配置的注入;
  • 使用@ConfigurationProperties注解,实现一组配置的注入。

SpringBoot的自动装配机制是什么?

  • 自动装配指的是SpringBoot会将约定配置下的bean自动加载到spring容器中;
  • 自动装配的核心注解是@SpringBootApplication,它又由@SpringBootConfiguration、@EnableAutoConfiguration 和 @ComponentScan组成;
    • @SpringBootConfiguration:本质是@Configuration,标注了@Configuration 的 Java 类都是一个 JavaConfig 配置类,在配置类中,任何一个标注了@Bean 的方法,其返回值都会作为 Bean 定义注册到 Spring IOC 容器中;
    • @ComponentScan:扫描指定路径下标识了需要装配的类,自动装配到 Spring IOC容器中,用于标识类需要装配的注解有:@Component、@Service、@Controller、@Repository;
    • @EnableAutoConfiguration:同样是一个复合注解,主要分为@AutoConfigurationPackage和@Import;
      • @AutoConfigurationPackage:该注解修饰的类所在的 package 会作为自动装配的 package 管理;
      • @Import:可以把多个分开的配置合并到一个配置中,而在@EnableAutoConfiguration中@Import导入了AutoConfigurationImportSelector类,它实现了Spring基于SPI的导入方式。
        • SPI配置文件的为META-INF/spring.factories,内容为k-v属性,key 为@EnableAutoConfiguration注解的全限定名,value为需要自动装配的配置类,需要被@Configuration修饰,多个用逗号分隔。

SpringBoot有哪些按条件装配的方式?

  • @Conditional:注解中只有一个class类型的属性,这个 class 便是需要实现条件判断的类,这个类必须实现 Condition 接口的 matches 方法,该方法会返回一个boolean类型值,通过这个值来判断条件是否成立。
  • Conditional其它相关注解:
注解名称描述
@ConditionalOnBean在某个 bean 存在的时候
@ConditionalOnMissingBean在某个 bean 不存在的时候
@ConditionalOnClass当前 classPath 下可以找到某个 class 的时候
@ConditionalOnMissingClass当前 classPath 下无法找到某个 class 的时候
@ConditionalOnResource当前 classPath 下是否存在某个资源文件
@ConditionalOnProperty当前 JVM 是否包含某个属性值
@ConditionalOnWebApplication当前 Spring context 是否是 web 应用程序
  • 除了通过注解声明,还可以通过SPI方式声明
    • 在 META-INF/spring-autoconfigure-metadata.properties中配置;
  • AutoConfigurationImportSelector在加载自动装配bean时,会先扫描spring-autoconfigure-metadata.propertie进行过滤,再加载 spring.factories。

如何自定义一个starter?

  1. 创建 Starter 项目;
  2. 项目创建完后定义 Starter 需要的配置(Properties)类,比如数据库的连接信息;
  3. 编写自动配置类,自动配置类就是获取配置,根据配置来自动装配 Bean;
  4. 编写 spring.factories 文件加载自动配置类,Spring 启动的时候会扫描 spring.factories 文件,加载文件中配置的类;
  5. 编写配置提示文件 spring-configuration-metadata.json(不是必须的),在添加配置的时候,我们想要知道具体的配置项是什么作用,可以通过编写提示文件来提示;
  6. 最后就是使用,在项目中引入自定义 Starter 的 Maven 依赖,增加配置值后即可使用。

如何实现starter的按需加载?

  • 创建自定义注解@Enable**注解;
    • 以 UserClient 为例, 创建自定义注解 @EnableUserClient;
    • 在注解中通过@Import导入我们的自动配置类;
    • 这样只有我们声明了@EnableUserClient,才会导入我们需要的bean。
  • 基于@ConditionalOn系列注解实现按条件注入。

内置容器的启动流程是什么?

  • 启动一个springboot项目,首先运行Application启动类的main方法,main 方法中调用了SpringApplication.run方法;
  • run方法中又调用了最核心的refreshContext方法,这里面又调用了我们最熟悉了spring容器启动模板方法refresh方法;
  • 默认SpringBoot会启动tomcat,在refresh中的onRefresh()中执行;
  • onRefresh调用了createWebServer()方法,通过TomcatServletWebServerFactory开始创建Tomcat实例;
  • 最后在refresh方法中的finishRefresh()中调用Tomcat实例的start逻辑,并将应用上下文发布的webServer中,至此完成Tomcat的启动。

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

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

相关文章

c语言本身有输入输出语句正确错误,C语言模拟选择题

导出试题1. 以下叙述正确的是。A) 在C程序中,main函数必须位于程序的最前面B) C程序的每行中只能写一条语句C) C语言本身没有输入输出语句D) 在对一个C程序进行编译的过程中,可发现注释中的拼写错误2. 以下叙述不正确的是。A) 一个C源程序可由一个或多个…

Dubbo常见面试题与答案

Dubbo的基础知识 Dubbo的核心架构是怎样的? Registry:注册中心。 负责服务地址的注册与查找,服务的 Provider 和 Consumer 只在启动时与注册中心交互。注册中心通过长连接感知 Provider 的存在,在 Provider 出现宕机的时候&#…

99行不用指针 c语言贪食蛇,关于C语言指针的问题

#include"iostream.h"structstudent{longnum;intscore;student*next;};student*creat();voidprint(student*head);student*insert(student*head,student*stud);student*del(student*head,longnum);voidmain(){student*headNULL,*stud;longnum;intscore;cout<建立学…

Redis常见面试题与答案

Redis的基本数据类型 Redis有哪些常用的数据类型&#xff1f; String&#xff1a;字符串&#xff08;最常用的缓存&#xff09;Hash&#xff1a;哈希&#xff08;保存对象&#xff09;List&#xff1a;有序列表&#xff08;消息队列&#xff09;Set&#xff1a;无序集合&…

c语言利用文件体写在桌面上,在C语言中怎样新建一个文件夹?

满意答案JacinthLancet推荐于 2017.10.12采纳率&#xff1a;56% 等级&#xff1a;12已帮助&#xff1a;35899人函数名: mkdir功 能: 建立一个目录(文件夹)用 法: int mkdir(char *pathname);程序例: (在win-tc和Dev-c下运行通过)#include #include #include int main(void){…

MySQL常见面试题与答案

存储引擎 InnoDB的主要特点是什么&#xff1f; MySQL5.5版本之后的默认存储引擎&#xff1b;支持事务&#xff1b;支持行级锁&#xff1b;支持MVCC&#xff1b;支持聚集索引方式存储数据。 InnoDB与MyISAM的区别&#xff1f; 存储引擎MyISAMInnoDB存储结构MyISAM在磁盘上存…

C语言6F多少,求助!!请人帮忙画C语言程序流程图.紧急!!!

#include <stdio.h>#define N 10struct student //第一步, 根据具体情况定义结构体类型。{ double num; /*学号*/float score[5]; //数组依次存放英语,数学,计算机基础及平均分};void input( struct student arr[ ], int ) ; /*函数原型*/void aver ( struct student arr…

java如何将String转换为enum

问题 假设定义了如下的enum&#xff08;枚举&#xff09;&#xff1a; public enum Blah {A, B, C, D }已知枚举对应的String值&#xff0c;希望得到对应的枚举值。例如&#xff0c;已知"A"&#xff0c;希望得到对应的枚举——Blah.A&#xff0c;应该怎么做&#x…

java解析c语言的结构体,JAVA中如何实现C中的结构体数组的功能?

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼比如我想实现在C中的结构体数组&#xff1a;struct student{string Sno;string Sname;string Sgen;string Sdept;int Sage;student(){Sno "";Sname "";Sgen "男";Sdept "";Sage 0;}}…

Java 解决跨域问题

JAVA | Java 解决跨域问题 文章目录JAVA | Java 解决跨域问题引言什么是跨域&#xff08;CORS&#xff09;什么情况会跨域解决方案前端解决方案后端解决方案具体方式一、使用Filter方式进行设置二、继承 HandlerInterceptorAdapter三、实现 WebMvcConfigurer四、使用Nginx配置五…

c语言写天气预报程序,微信小程序实现天气预报功能

获取应用实例var app getApp()Page({data: {//加载状态loadingHidden: false,//当前温度currentTemperature: ,//夜间温度nightAirTemperature: ,//白天温度dayAirTemperature: ,//当前天气weather: ,//污染指数aqi: ,//污染程度quality: ,//风力windPower: ,//风向windDirect…

Spring 异常处理三种方式

Spring 异常处理三种方式 异常处理方式一. ExceptionHandler异常处理方式二. 实现HandlerExceptionResolver接口异常处理方式三. ControllerAdviceExceptionHandler三种方式比较说明(强烈推荐各位看一下&#xff0c;我觉得自己总结的比较多&#xff0c;嘿嘿&#xff0c;不对之…

Netty常见面试题 与 答案

Netty基础知识 什么是Netty&#xff1f; Netty 是一款用于高效开发网络应用的 NIO 网络框架&#xff0c;它大大简化了网络应用的开发过程&#xff1b; 封装了JDK底层的NIO模型&#xff0c;提供高度可用的API&#xff0c;用于快速开发高性能服务端和客户端&#xff1b;精心设计…

c语言’内存清除函数,c语言常用内存处理函数

memset()#includevoid*memset(void*s,int c,size_t n);功能&#xff1a;将s的内存区域的前n个字节以参数c填入(用来初始化)参数&#xff1a;s:需要操作内存s的首地址c:填充的字符&#xff0c;c虽然参数为int,但必须是unsigned char,范围为0-255n:指定需要设置的大小返回值&…

c语言编俄罗斯方块有注释,C语言学习1年-俄罗斯方块(无注释)

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼#include #include #include #include #include int randtmp3,i,j,p,q,fx,fy,s,t,c,r,dltm,begin0,fq,k,a,sj,score0;int dla32000;int nx[5],ny[5],h[5],m[25];int x[8][4]{0,0,0,0,0,-2,-1,0,0,0,1,2,0,0,0,0,0,-1,0,1,0,0,1,1,0…

使用 @ControllerAdvice 和 实现ResponseBodyAdvice接口, 拦截Controller方法默认返回参数,统一处理返回值/响应体

使用 ControllerAdvice 和 实现ResponseBodyAdvice接口&#xff0c; 拦截Controller方法默认返回参数&#xff0c;统一处理返回值/响应体 1、Controller代码 以下是Controller方法源码&#xff1a; RestController RequestMapping("/manage/user") public class Te…

c语言中字符占用的存储单元,C语言知识点第1章.doc

C语言知识点第1章C语言知识点总结(二) 第八节 字符字符常量定义&#xff1a;一对单引号括起来的一个字符。如‘A’、‘a’、‘9’相应字符对应的ASCII编码值(见附录四)字符常量占用一个字节的存储单元(一个字节占8位)重点&#xff1a;表 C语言中常见的转义字符字符形式意义字符…

Spring的@ExceptionHandler注解使用方法

文章目录1&#xff0c;基本使用方法2&#xff0c;注解的参数3&#xff0c;就近原则4&#xff0c;注解方法的返回值5&#xff0c;错误的操作1&#xff0c;基本使用方法 Spring的ExceptionHandler可以用来统一处理方法抛出的异常&#xff0c;比如这样&#xff1a; ExceptionHan…

c语言dfs算法全排列代码,c语言dfs解决全排列问题

如1,2,3三个元素的全排列为&#xff1a;1,2,31,3,22,1,32,3,13,1,23,2,1共3*2*16种代码简单实现n个元素的全排列#include #define N 5int a[100];//存放数字序列int mark[100];//判断数字是否使用过,mark[3]1表示3这个数字能用int count;void dfs(int i,int a[N]);int main(int…

CAS单点登录详细流程

一、CAS简介和整体流程 CAS 是 Yale 大学发起的一个开源项目&#xff0c;旨在为 Web 应用系统提供一种可靠的单点登录方法&#xff0c;CAS 在 2004 年 12 月正式成为 JA-SIG 的一个项目。CAS 具有以下特点&#xff1a; 【1】开源的企业级单点登录解决方案。 【2】CAS Server 为…