Spring框架最全面试题集——Spring Framework、Spring MVC、Spring Boot

13 篇文章 0 订阅
9 篇文章 0 订阅

Spring

1. 什么是Spring

       Spring是轻量级的资源整合框架,为java提供基础架构支持,简化企业级应用的开发,整合资源,以一种更加科学的方式对外提供服务,例如提高对应的应用效率、降低系统的开销、提高代码的可维护性等。它有两大核心理念:分别是IoC和AOP。

2. 什么是IoC

       IoC即控制反转,是一种设计思想,主要用于降低程序之间的耦合度。IoC思想是将对象的创建和管理从程序内部转移到外部容器,实现了模块间的解耦,使得各个模块更加独立。在Spring框架中,IoC思想主要是通过DI和IoC容器实现的。

3. Spring中如何管理Bean对象

       在Spring程序中,可以使用ApplicationContext来管理和获取Bean。通过加载配置文件或使用注解扫描,Spring框架创建和和初始化所有的Bean,并将其保存在ApplicationContext中。可以通过getBean()方法来获取已创建的Bean实例。

4. 为什么要将Bean交给框架管理

       Spring为对象赋予了很多更加科学的特性,如延迟加载、作用域、生命周期方法以及运行时的自动依赖注入机制等。基于这些特性可以更好的提高对象的应用性能以及程序的可扩展性。

5. Bean的作用域

  • singleton:单例模式
  • prototype:多例模式,每次调用getBean()都会创建一个bean
  • request:每个http请求都会创建一个bean
  • session:同一个session共享同一个实例
  • application:整个serverContext只有一个bean
  • webSocket:一个webSocket只有一个bean

6. Bean的生命周期

  • 实例化阶段:在这个阶段中,IoC容器会创建一个Bean的实例,并将为其分配空间,这个过程可以通过构造方法完成。
  • 属性赋值阶段:在实例化完成Bean之后,容器会把Bean中的属性值注入到Bean中,这个过程可以通过set方法完成。
  • 初始化阶段:在属性注入之后,容器会对Bean进行一些初始化操作。
  • 使用阶段:初始化完成后,Bean对象就可以被容器使用。
  • 销毁阶段:容器在关闭时会对所有的Bean进行销毁操作,释放资源。

7. Spring中属性注入方式及异同点

       Spring中属性注入方式有3种,分别是构造器注入、set方法注入,属性赋值。

  1. 构造函数注入:通过类的构造方法来实现的,在创建对对象的时候,通过构造方法的参数来传递依赖对象。
    • 优点:对象的依赖关系在创建时就已经确定,可以保证对象的状态是完全初始化的。构造函数的参数明确标识了对象所需的依赖,降低了出错的可能性。
    • 缺点:如果有多个依赖项,构造函数的参数列表会变得很长,不便于维护和扩展,需要显式地在每次创建对象时传递依赖项。
  2. set方法注入:setter方法注入是通过属性对应的set方法对属性进行赋值
    • 优点:对象创建后,可以在任何时候更改依赖项。在某些情况下,可以允许没有依赖项的情况发生(可选依赖)。
    • 缺点:对象的依赖关系可能会在不知道的情况下发生更改,导致状态不确定,需要编写大量的setter方法,增加了代码量个维护成本。
  3. 属性注入:通过反射机制获取属性,并按照制定规则为属性赋值。
    • 优点:简化了代码,无需编写繁琐的构造函数或setter方法,可以通过注解自动完成依赖项的注入
    • 缺点:对象的依赖关系不易于查看和修改,可能会导致对外部依赖和隐藏于滥用,不利于单元测试,无法通过构造函数传递模拟依赖。

8. Autowired的作用

       @Autowired是spring定义的注解,用于描述类中属性或相关方法(构造、set等)。Spring框架在项目运行时如果发现框架管理的Bean对象中有使用@Autowired注解的属性或方法,则按照制定规则为属性赋值(DI)。

       @Autowired属性赋值的基本规则是:首先检测容器中是否有与属性或方法参数类型相匹配的对象,加入有且只有一个则直接注入,如果有多个,按照描述的属性或参数名查找是否有名字匹配的对象,有则直接注入,没有则抛出异常。如果有明确要求,必须要注入类型为指定类型,名字未指定名字的对象使用@Qualifier对其属性或参数进行描述。

9. @Qualifier的作用

       @Qualifier注解用于描述属性或方法参数,当有多个相同类型的bean却只有一个需要自动装配时,将@Qualifier注解和@Autowired注解结合使用以消除混淆,指定需要装配的确切bean。

10. Spring框架中的单例Bean对象是线程安全的吗?

       不是线程安全的。当多个用户同时请求同一服务时,容器会给每一个请求分配一个线程,这时多个线程并发执行该请求对应的业务逻辑,如果该处理逻辑中有对该单例状态的修改(如成员属性),则必须考虑线程同步问题。

       Spring框架中并没有单例Bean进行任何多线程的封装处理。关于单例bean的线程安全和并发问题需要开发者自行定义和处理。

       比如:我们通常在项目中使用的Spring Bean都属不可变的状态(如Dao类),所以在某种程度上说Spring的单例bean是线程安全的。如果项目中的bean有多种状态(如view modle对象),就需要自行保证线程安全。最简单的解决方法是将其作用域改为"prototype"。

11. 什么是AOP

       AOP即面向切面编程,是Spring框架的核心思想之一,也是一种编程范式。它主要的目的是将哪些与业务逻辑关系不大,但在多个对象或方法中重复出现的代码,如日志记录、安全检查、事务处理等,提取出来形成独立的模块,即所谓的"切面"。然后通过"切入点"表达式将这些切面代码织入到目标对象的方法执行前后,从而实现关注点分离的目的,提高代码的可重用性、可维护性和可测试性。

       在Spring框架中,AOP是通过代理模式实现的,可以创建动态代理来拦截方法调用,并在调用前后执行切面代码。Spring AOP提供了丰富的功能,允许开发者自定义切面和切入点,支持注解方式的切面配置,使得AOP的使用更加灵活方便。

       Spring AOP使用切面(aspect)来定义横切关注点以及它们在目标对象中的应用方式。切面由切点(pointcut)和通知(advice)组成。切点定义了在目标中哪些方式会被应用横切关注点,通知定义了在切点被触发时要执行的逻辑。

       通知可以分为以下几种:

  • 前置通知(Before advice):在目标方法执行之前执行
  • 后置通知(After advice):在目标方法执行之后(无论是否出现异常)执行
  • 返回通知(After returning advice):在目标方法正常返回之后执行
  • 异常通知(After throwing advice):在目标方法抛出异常之后执行
  • 环绕通知(Around advice):在目标方法执行前和执行后都可以执行自定义逻辑

       总而言之,AOP这种面向切面编程的思想,将横切关注点应用到模块化代码中,降低了代码之间的耦合度,提高了代码的可重用性,可维护性。

       常见的AOP使用场景:记录操作日志,缓存处理,Spring中内置的事务处理。

12. Spring中的事务是如何实现的

       Spring的事务有两种实现方式,分别是编程式事务控制和声明式事务管理。其中编程式由于对代码具有侵入性,一般不使用。而声明式事务管理是通过AOP实现的,对方法前后进行拦截,在执行方法之前开启事务,在目标方法结束之后根据执行情况提交事务或回滚事务。

13. Spring中事务失效的场景有哪些

  • 异常捕获处理:自己处理了异常,没有抛出。解决:手动抛出异常
  • 抛出检查异常:配置rollbackFor属性为Exception
  • 非public方法导致的事务失效:改为public

14. Spring中bean的生命周期

在这里插入图片描述

  1. 通过BeanDefinition获取bean的定义信息
  2. 调用构造函数实例化bean
  3. bean的依赖注入
  4. 处理Aware接口(BeanNameAare,BeanFactoryAware,ApplicationContextAware)
  5. Bean的后置处理器BeanPostProcessor-前置
  6. 初始化方法(InitializingBean,init-method)
  7. Bean的后置处理器BeanPostProcessor-后置
  8. 销毁bean

15. 如何定义一个全局异常处理器

       首先创建全局异常处理器类,并在其类上添加@ControllerAdvice或@RestControllerAdvice注解,然后定义一些用于捕捉不同异常类型的方法,在这些捕获异常的方法上添加@ExceptionHandler(value = Exception.class),方法参数是异常类型,然后将异常消息进行处理。

16. 如何使用AOP自定义日志

  1. 创建一个切面类,把他添加到IoC容器中并添加@Aspect注解
  2. 在切面类中写一个通知方法,在方法上添加通知注解并通过切入点来表示要对哪些方法进行日志打印,然后方法参数为JoinPoint
  3. 通过JoinPoint这个参数可以获取当前执行的方法名,方法参数等信息,这样就可以根据需求在方法进入或结束时打印日志。

17. Spring中Bean的循环依赖及其解决方法

  • 循环依赖:循环依赖即循环引用,指两个或两个以上的bean互相持有对方,最终形成闭环,比如A依赖B,B依赖A
  • 循环依赖在spring中是允许存在的,spring框架依据三级缓存已经解决了大部分的循环依赖。
    1. 一级缓存:单例池,缓存已经经历了完整的生命周期,已经初始化完成的bean对象
    2. 二级缓存:缓存早期的bean对象(生命周期还没走完)
    3. 三级缓存:缓存的是ObjectFactory,表示对象工厂,用来创建某个对象的

18. 构造方法出现循环依赖如何解决

A依赖于B,B依赖于,注入方式是构造函数。

  • 原因:由于Bean的生命周期中构造函数时第一个执行的,spring框架并不能解决构造函数的依赖注入。
  • 解决方案:使用@Lazy进行懒加载,什么时候需要对象再进行bean对象的创建。

19. Spring中的事务传播

       Spring框架中的事务传播定义了多个事务方法相互调用时,事务如何在这些方法之间进行传播和处理。具体来说,Spring定义了7种不同的事务传播行为。

  1. PROPAGATION_REQUIRED:Spring的默认传播级别。如果当前存在一个事务,则加入该事务;如果当前没有事务,则创建一个新的事务。

  2. PROPAGATION_SUPPORTS:支持当前事务,如果当前存在事务,则加入事务;如果当前没有事务,则以非事务的方式执行。

  3. PROPAGATION_MANDATORY:支持当前事务,如果当前存在事务,则加入事务;如果当前没有事务,则抛出异常

  4. PROPAGATION_REQUIRES_NEW:创建一个新的事务,如果当前存在事务,则将当前事务挂起

  5. PROPAGATION_NOT_SUPPORTED:以非事务方式执行,如果当前存在事务,则将当前事务挂起

  6. PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常

  7. PROPAGATION_NESTED:如果当前存在事务,则在嵌套事务内执行,如果当前没有事务,则与PROPAGATION_REQUIRED类似,即创建一个新的事务

20. Spring MVC工作原理

  1. 首先客户端发送请求至前端控制器DispatcherSevlet

  2. DispatcherSevlet收到请求后,调用处理器映射器HandlerMapping

  3. HandlerMapping根据请求的url找到具体的Controller

  4. 通过处理器适配器HandlerAdapter找到具体执行该方法的实现类

  5. Controller处理请求,并返回ModelAndView

  6. DispatcherServlet通过视图解析器ViewReslover确定负责显示数据的具体View

  7. DispatcherServlet对View进行渲染视图,并将完整的视图响应到客户端

21. SpringBoot的优势

       SpringBoot是一个基于Spring框架的脚手架,其设计目标是用于简化Spring应用程序的开发和部署。在SpringBoot中提供了一些基础依赖,基础配置,通过这些快速实现开箱即用。玩-0比于传统的Spring应用程序,SpringBoot具有以下几点优势:

  1. 简化配置:SpringBoot提供了自动配置的机制,不再需要手动编写大量的配置文件,只需要通过一些约定的方式配置即可,大大减少了开发过程中的配置工作。

  2. 内嵌式容器:SpringBoot内置了Tomcat,Jetty等多种Web容器,可以直接以可执行的Jar包形式运行。不再需要通过外部的Web服务器部署应用程序,简化了部署的流程。

  3. 开发效率高:提供了很多开箱即用的功能和组件,如数据访问、事务管理、安全性等,减少了开发人员的重复工作,提高了开发效率。

  4. 微服务支持:SpringBoot作为Spring Cloud的基础,提供了丰富的微服务相关的开发和集成功能,如服务的注册与发现、负载均衡、分布式配置等

  5. 易于集成:SpringBoot与其他框架和扩展组件的继承非常方便,提供了大量的Starter依赖,可以简单地引入和配置,快速继承第三方库或服务。

  6. 自动化管理:SpringBoot提供了一套强大的开发、部署和监控工具,可以进行自动化地构建、测试、部署等,大大简化了应用程序地管理和维护。

  7. 强大的生态系统:SpringBoot拥有一个庞大地社区和生态系统,提供了丰富地文档、示例、教程和支持,能够快速解决开发过程中的问题。

22. SpringBoot启动流程

       SpringBoot启动主要包含以下几个步骤:

  1. 加载配置文件和初始化环境:
    - SpringBoot会根据默认的配置文件名(application.properties或application.yml)加载配置参数
    - SpringBoot会根据环境变量、命令行参数等信息来初始化应用程序的环境

  2. 扫描并加载主配置类:
    - SpringBoot会扫描应用程序中的所有类,查找带有@SpringBootApplication注解的主配置类
    - 主配置类是SpringBoot应用程序的入口点,它包含了应用程序的一些核心配置和组件。

  3. 创建并配置Spring应用上下文ApplicationContext:
    - SpringBoot会根据主配置类创建一个Spring应用上下文
    - ApplicationContext是Spring IoC容器的实例,用于管理和装配Bean

  4. 执行自动配置 :
    - SpringBoot根据依赖和配置的自动装配规则,自动配置应用程序的各个组件
    - 自动配置将根据类路径中的依赖和配置文件的配置,为应用程序添加所需的主要组件,如数据库连接池、Web服务器等

  5. 执行应用程序 :
    - SpringBoot会根据配置的Web服务器创建对应的Servlet容器
    - Servlet容器关闭后,SpringBoot会将请求交给Spring MVC框架处理,并返回响应
    - SpringBoot还可以执行其他应用程序逻辑,如定时任务、消息队列

  6. 关闭应用程序 :
    - 当应用程序接收到关闭信号或调用SpringBoot提供的关闭接口时,应用程序会执行关闭流程
    - SpringBoot会按照事先定义好的顺序,关闭应用程序的相关组件和资源

23. SpringBoot的自动配置原理

  • 在SpringBoot项目中的引导类上有一个注解@SpringBootApplication,这个注解对3个注解进行了封装,分别是:

    • @SpringBootConfiguration
    • @EnableAutoConfiguration
    • ComponentScan
  • 其中,@EnableAutoConfiguration是实现自动化配置的核心注解,该注解对2个注解进行了封装,分别是@AutoConfigurationPackage和@Import(Auto Configuration Import Selector.class)。通过@Import注解导入了对应的配置选择器,内部读取了该项目和该项目引用的jar包的classpath路径下的META-INF/spring.factories文件中的所有配置的类的全类名。在这些配置类中所定义的Bean会根据条件注解所指向的条件来决定是否需要将其导入到Spring容器中

  • 条件判断会有像@ConditionalOnClass这样的注解,判断是否有对应的class文件,如果有则加载该类,把这个配置类的所有Bean放入到Spring容器中使用。

24. 谈谈对Spring Starter的理解

       Spring Starter是SpringBoot项目中的一种依赖描述符,用于简化项目的配置和管理。

       首先,Spring Starter的核心理念在于提供一种简化的方式来引入和管理一个项目所需的各种依赖库和配置。它通过预定义的依赖集合,使得开发者能够快速整合Spring生态系统中的各种技术栈,提高开发效率。

       其次,Spring Starter的主要特点包括:

  • 预定义的依赖集合:每个Starter包含了实现特定功能所需的库和组件,以及相应的配置文件。

  • 自动配置:Starter遵循"约定优于配置"的原则,通过自动配置减少手动配置的工作量

  • 简化构建工具配置:Starter简化了Maven或Gradle等构建工具中的依赖管理。

  • 提供默认配置:官方提供的Starter遵循约定成俗的默认配置,并允许开发者根据自身需求进行调整。

       最后,Spring Starter的应用场景主要是在SpringBoot项目中,无论是开发Web应用、数据库访问、消息传递还是其他任何类型的服务,都可以找到相应的Starter来快速搭建项目基础框架。如spring-boot-starter-web提供了构建Web应用程序所需的所有库和配置,包括Spring MVC, Tomcat和相关的Web技术。

       总的来说,Spring Starter是SpringBoot为了简化项目搭建和配置过程而提供的一种便捷工具,它通过继承相关依赖和自动配置,极大的提高了开发效率和项目的可维护性。

25. 谈谈对MVC的理解

       MVC是一种广泛使用的软件设计模式,它代表Model-View-Controller(模型-视图-控制器)

       首先,MVC的核心理念是将应用程序分成三个核心组件:模型,视图,控制器,具体如下:

  • 模型:负责管理应用程序的数据和业务逻辑。它处理所有与数据相关的操作,如数据交互,数据检索和数据存储等

  • 视图:是用户界面的组成部分,负责数据的展示,它从模型中获取数据并呈现给用户

  • 控制器:作为模型和视图之间的协调者,负责接收用户的输入,并调整模型来响应用户的需求,最后选择相应的视图进行展示。

其次,MVC的主要优点包括:

  • 分离关注点:每个组件都有其明确的职责,使得代码更加模块化,便于管理和扩展

  • 提高可维护性:由于各部分之间的耦合度较低,修改一个组件通常不会影响到其他组件

  • 增强灵活性:可以独立地更改视图或业务逻辑,而不影响其他部分

  • 提高可复用性:模型和控制器地分离使得它们可以在不同的环境中重用

       总的来说,虽然MVC不是唯一的设计模式,也不是所有项目必须采用的,但是它通过分离关注点,提高了代码的可读性和可维护性,对于大型复杂的应用程序开发者来说,是一种非常有效的组织方式。

26. 谈谈对Spring MVC的理解

       Spring MVC是Spring Framework生态中的一个模块,它是一个基于Servlet API构建的Web框架,使用MVC模式设计来简化传统的Web开发方式。

       首先,Spring MVC对Java Web中的MVC架构进行了增强和扩展。它将传统MVC中的Controller拆分成了前端控制器DispatcherServlet和后端控制器Controller,将Model进一步细分成业务层和数据访问层,并且在视图层支持多种不同的视图技术,如Freemarker、Velocity、JSP等。

       其次,Spring MVC的工作流程是,当浏览器发出请求后,核心控制器DispatcherServlet会对这些请求进行分发,将其转发到对应的Controller进行处理。Controller处理完业务逻辑之后,会返回一个ModeAndView对象,随后DispatcherServlet会通过ViewResolver找到对应的视图,并将数据显示到客户端。

       总的来说,Spring MVC是一个高度可配置和可扩展的Web框架,它遵循MVC模式的原则,提供了一套完整的开发流程和特性。通过与Spring框架的无缝集成,它能够实现灵活性、可配置性和可扩展性,帮助开发者构建高性能的Web应用程序。

27. Spring框架常用注解

  • Spring

    @Component@Controller@Service@Repository
    @Autowired@Qualified@Scope@Configuration
    @ComponentScan@Bean@Import@Aspect
    @Before@After@Around@Pointcut
  • SpringMVC

    @RequestMapping@RequestBody@RequestParam
    @PathVirable@ResponseBody@RequestHeader
    @RestController
  • SpringBoot

    @SpringBootApplication@EnableAutoConfiguration@ComponentScan

28. Spring中用到的设计模式有哪些

  1. 建造模式:BeanDefinitionBuilder(通过此对象构建BeanDefinition对象)
  2. 工厂模式:BeanFactory(用于构建Bean对象的工厂)
  3. 工厂方法模式:ProxyFactoryBean(通过Bean对象中的方法构建ProxyFactory)
  4. 单例模式:单例Bean对象(作用域为singleton的bean对象)
  5. 代理模式:AOP Proxy(JDK代理,CGLIB代理)
  6. 策略模式:AOP代理策略,SimpleInstantitationStrategy
  7. 适配器模式:HandleAdapter,AdvisorAdapter
  8. 模板方法模式:JdbcTemplate(对Jdbc的操作进行了封装,提供了一些访问数据库的模板方法)
  9. 责任链模式:HandlerInceptor(SpringMVC中的拦截器,控制对Controller对象方法的方法)
  10. 观察者模式:ApplicationListener(监听服务的启动,销毁)
  • 36
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

墨尘儿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值