Springboot面试整理

2023-10-11 13:54:59 浏览数 (1)

Spring

Spring Bean相关

什么是Spring Bean

简单来说,Bean 代指的就是那些被 IoC 容器所管理的对象。通过配置元数据可以告诉 IoC 容器帮助我们管理哪些对象。配置元数据可以是 XML 文件、注解或者 Java 配置类。

Spring 中bean的生命周期

Bean 的生命周期指的是 Bean 在 Spring(IoC)中从创建到销毁的整个过程。Bean 的生命周期主要包含以下 5 个流程:

1.实例化:为 Bean 分配内存空间;

2.设置属性:将当前类依赖的 Bean 属性,进行注入和装配;

3.初始化:

执行各种通知。

执行初始化的前置方法。

执行初始化方法。

执行初始化的后置方法。

4.使用 Bean:在程序中使用 Bean 对象;5.销毁 Bean:将 Bean 对象进行销毁操作。

将一个类声明为 Bean 的注解有哪些?

@Component:通用的注解,可标注任意类为 Spring 组件。如果一个 Bean 不知道属于哪个层,可以使用@Component 注解标注。

@Repository : 对应持久层即 Dao 层,主要用于数据库相关操作。

@Service : 对应服务层,主要涉及一些复杂的逻辑,需要用到 Dao 层。

@Controller : 对应 Spring MVC 控制层,主要用于接受用户请求并调用 Service 层返回数据给前端页面。

bean的作用域有哪些

  1. singleton : IoC 容器中只有唯一的 bean 实例。Spring 中的 bean 默认都是单例的,是对单例设计模式的应用。
  2. prototype : 每次获取都会创建一个新的 bean 实例。也就是说,连续 getBean() 两次,得到的是不同的 Bean 实例。
  3. request (仅 Web 应用可用): 每一次 HTTP 请求都会产生一个新的 bean(请求 bean),该 bean 仅在当前 HTTP request 内有效。
  4. session (仅 Web 应用可用) : 每一次来自新 session 的 HTTP 请求都会产生一个新的 bean(会话 bean),该 bean 仅在当前 HTTP session 内有效。
  5. application/global-session (仅 Web 应用可用):每个 Web 应用在启动时创建一个 Bean(应用 Bean),该 bean 仅在当前应用启动时间内有效。websocket (仅 Web 应用可用):每一次 WebSocket 会话产生一个新的 bean。

如何配置bean的作用域

通过注解和xml方式

bean是线程安全的麽

Spring 框架中的 Bean 是否线程安全,取决于其作用域和状态。几乎所有场景的 Bean 作用域都是使用默认的 singleton ,重点关注 singleton 作用域即可。

prototype 作用域下,每次获取都会创建一个新的 bean 实例,不存在资源竞争问题,所以不存在线程安全问题。

singleton 作用域下,IoC 容器中只有唯一的 bean 实例,可能会存在资源竞争问题(取决于 Bean 是否有状态)。如果这个 bean 是有状态的话,那就存在线程安全问题(有状态 Bean 是指包含可变的成员变量的对象)。不过,大部分 Bean 实际都是无状态(没有定义可变的成员变量)的(比如 Dao、Service),这种情况下, Bean 是线程安全的。

对于有状态单例 Bean 的线程安全问题,常见的有两种解决办法:

在 Bean 中尽量避免定义可变的成员变量。在类中定义一个 ThreadLocal 成员变量,将需要的可变成员变量保存在 ThreadLocal 中(推荐的一种方式)。

注解

@Autowired 和 @Resource 的区别是什么?

  1. @Autowired 是 Spring 提供的注解,@Resource 是 JDK 提供的注解。
  2. Autowired 默认的注入方式为byType(根据类型进行匹配),@Resource默认注入方式为 byName(根据名称进行匹配)。
  3. 当一个接口存在多个实现类的情况下,@Autowired和@Resource都需要通过名称才能正确匹配到对应的 Bean。
  4. @Autowired 可以通过 @Qualifier注解来显式指定名称, @Resource可以通过 name 属性来显式指定名称。
  5. @Autowired 支持在构造函数、方法、字段和参数上使用。@Resource 主要用于字段和方法上的注入,不支持在构造函数或参数上使用。spring的常用注解

spring常用注解

  1. @Component:@Component 是一个通用的注解,用于表示一个受Spring管理的组件,通常是一个Java类。它允许Spring自动发现和装配这些组件。
  2. @Controller:@Controller 用于标识一个控制器类,通常在Spring MVC中使用,用于处理HTTP请求。
  3. @Service:@Service 用于标识一个服务类,通常用于业务逻辑层。
  4. @Repository:@Repository 用于标识一个数据访问层的类,通常用于数据库操作。
  5. @Configuration:@Configuration 用于表示一个配置类,其中包含Bean的定义和其他配置。
  6. @Bean:@Bean 用于方法级别,将方法的返回值作为一个Bean注册到Spring容器中。
  7. @Autowired:@Autowired 用于自动装配Bean,可以用在字段、构造方法、Setter方法上。
  8. @Qualifier:与@Autowired结合使用,指定要注入的Bean的名称。
  9. @Value:@Value 用于注入外部属性值到一个Bean的字段、方法参数或构造函数参数中。
  10. @Scope:@Scope 用于指定Bean的作用域,如singleton、prototype等

Spring IOC

Spring IOC的理解

IoC(Inversion of Control:控制反转)是一种设计思想,而不是一个具体的技术实现。IoC 的思想就是将原本在程序中手动创建对象的控制权,交由 Spring 框架来管理。不过, IoC 并非 Spring 特有,在其他语言中也有应用。

控制:指的是对象创建(实例化、管理)的权力

反转:控制权交给外部环境(Spring 框架、IoC 容器)

将对象之间的相互依赖关系交给 IoC 容器来管理,并由 IoC 容器完成对象的注入。这样可以很大程度上简化应用的开发,把应用从复杂的依赖关系中解放出来。 IoC 容器就像是一个工厂一样,当我们需要创建一个对象的时候,只需要配置好配置文件/注解即可,完全不用考虑对象是如何被创建出来的。

Spring有哪些方式进行依赖注入

  1. 属性注入(Field Injection);
  2. Setter 注入(Setter Injection);
  3. 构造方法注入(Constructor Injection)。

Spring MVC

说说自己对于 Spring MVC 了解?

MVC 是模型(Model)、视图(View)、控制器(Controller)的简写,其核心思想是通过将业务逻辑、数据、显示分离来组织代码。

Spring MVC 的核心组件有哪些?

  1. DispatcherServlet:核心的中央处理器,负责接收请求、分发,并给予客户端响应。
  2. HandlerMapping:处理器映射器,根据 URL 去匹配查找能处理的 Handler ,并会将请求涉及到的拦截器和 Handler 一起封装。
  3. HandlerAdapter:处理器适配器,根据 HandlerMapping 找到的 Handler,适配执行对应的 Handler;
  4. Handler:请求处理器,处理实际请求的处理器。
  5. ViewResolver:视图解析器,根据 Handler 返回的逻辑视图 / 视图,解析并渲染真正的视图,并传递给 DispatcherServlet 响应客户端

SpringMVC 工作原理了解吗?

  1. 客户端(浏览器)发送请求, DispatcherServlet拦截请求。
  2. DispatcherServlet 根据请求信息调用 HandlerMapping 。HandlerMapping 根据 URL 去匹配查找能处理的 Handler(也就是我们平常说的 Controller 控制器) ,并会将请求涉及到的拦截器和 Handler 一起封装。
  3. DispatcherServlet 调用 HandlerAdapter适配器执行 Handler 。
  4. Handler 完成对用户请求的处理后,会返回一个 ModelAndView 对象给DispatcherServlet,ModelAndView 顾名思义,包含了数据模型以及相应的视图的信息。Model 是返回的数据对象,View 是个逻辑上的 View。
  5. ViewResolver 会根据逻辑 View 查找实际的 View。
  6. DispaterServlet 把返回的 Model 传给 View(视图渲染)。
  7. 把 View 返回给请求者(浏览器)

统一异常处理怎么做

使用注解的方式统一异常处理,具体会使用到 @ControllerAdvice @ExceptionHandler 这两个注解

好处:会给所有或者指定的 Controller 织入异常处理的逻辑(AOP),当 Controller 中的方法抛出异常的时候,由被@ExceptionHandler 注解修饰的方法进行处理。

Spring 框架中用到了哪些设计模式?

  1. 工厂设计模式 : Spring 使用工厂模式通过 BeanFactory、ApplicationContext 创建 bean 对象。
  2. 代理设计模式 : Spring AOP 功能的实现。
  3. 单例设计模式 : Spring 中的 Bean 默认都是单例的。
  4. 模板方法模式 : Spring 中 jdbcTemplate、hibernateTemplate 等以 Template 结尾的对数据库操作的类,它们就使用到了模板模式。
  5. 包装器设计模式 : 我们的项目需要连接多个数据库,而且不同的客户在每次访问中根据需要会去访问不同的数据库。这种模式让我们可以根据客户的需求能够动态切换不同的数据源。
  6. 观察者模式: Spring 事件驱动模型就是观察者模式很经典的一个应用。
  7. 适配器模式 : Spring AOP 的增强或通知(Advice)使用到了适配器模式、spring MVC 中也是用到了适配器模式适配Controller。

Spring 事务

什么是事务

事务是逻辑上的一组操作,要么都执行,要么都不执行。

事务的特性

  1. 原子性(Atomicity):事务是最小的执行单位,不允许分割。事务的原子性确保动作要么全部完成,要么完全不起作用;
  2. 一致性(Consistency):执行事务前后,数据保持一致,例如转账业务中,无论事务是否成功,转账者和收款人的总额应该是不变的;
  3. 隔离性(Isolation):并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间数据库是独立的;
  4. 持久性(Durability):一个事务被提交之后。它对数据库中数据的改变是持久的,即使数据库发生故障也不应该对其有任何影响。

介绍spring boot

Spring Boot是一个用于简化和加速Spring应用程序开发的开源框架。它是基于Spring框架的,但旨在更容易地创建独立的、生产级别的应用程序。以下是关于Spring Boot的简要介绍:

简化配置:Spring Boot通过自动配置(Auto-Configuration)来减少了传统Spring应用程序中的样板式配置。它可以自动检测并配置应用程序所需的各种组件,包括数据源、Web服务器、消息队列等。这样,开发人员可以专注于编写业务逻辑,而不必花费太多时间在配置上。

集成Spring框架:Spring Boot是构建在经典的Spring框架之上的,因此继承了Spring的强大功能,如依赖注入、面向切面编程(AOP)、事务管理等。它允许您使用Spring的各种模块,如Spring MVC、Spring Data、Spring Security等,以构建全功能的应用程序。

内嵌式Web服务器:Spring Boot内置了多个Web服务器,如Tomcat、Jetty和Undertow。这意味着您可以创建独立的可执行JAR文件或WAR文件,其中包含了您的应用程序和Web服务器,无需额外配置。

约定优于配置:Spring Boot遵循"约定优于配置"的原则,通过约定和默认设置来减少配置需求。这使得应用程序的结构更加清晰,并且开发人员可以快速了解项目的组织方式。

丰富的起步依赖(Starter Dependencies):Spring Boot提供了大量的起步依赖,这些依赖包含了常见场景下所需的库和配置。您可以通过引入适当的起步依赖,轻松地集成数据库、消息队列、安全性等功能。

自动化生产级别功能:Spring Boot为生产环境提供了各种功能,如性能监控、健康检查、安全性、日志记录等。这些功能使得应用程序容易部署和维护。

spring boot有哪些功能模块、操作数据库的模块是哪个

自动配置(Auto-Configuration):Spring Boot根据应用程序的依赖和类路径自动配置各种组件,如数据源、Web服务器、消息队列等,减少了繁琐的手动配置工作。

起步依赖(Starter Dependencies):Spring Boot提供了一系列预定义的起步依赖,它们包含了常见场景下所需的库和配置。开发人员可以轻松地引入这些依赖,以集成数据库、消息队列、安全性等功能。

Spring Boot AOP:支持面向切面编程(AOP)的模块,可以方便地实现横切关注点,如日志、性能监控等。

Spring Boot CLI:命令行界面工具,用于快速创建和运行Spring Boot应用程序。

Spring Boot Initializer:Web界面工具,用于生成Spring Boot项目的初始代码。您可以选择所需的项目配置和依赖,然后生成项目结构。

Spring Boot Web:包括Spring MVC和Spring Webflux,用于构建Web应用程序的模块。

内嵌式Web服务器:Spring Boot支持多个内嵌式Web服务器,包括Tomcat、Jetty和Undertow。这些服务器可以轻松地集成到应用程序中,无需额外的配置。

Spring Boot Actuator:提供了用于监控和管理应用程序的功能,包括健康检查、性能监控、日志记录和应用信息端点。

Spring Boot DevTools:开发工具,提供了自动重启应用程序、实时重新加载和其他开发辅助功能,加速开发周期。

Spring Boot Data:简化数据访问的模块,包括Spring Data JPA、Spring Data MongoDB、Spring Data Redis等,使得与数据库和其他数据存储的交互更加容易。

Spring Boot Security:用于身份验证和授权的安全性模块,可以轻松添加安全性功能到应用程序中。

Spring Boot Test:用于编写单元测试和集成测试的测试框架,提供了各种测试工具和注解。

Spring Boot Cloud:用于构建云原生应用程序的模块,包括服务注册与发现、负载均衡、配置管理等。

Spring Boot Batch:用于批处理处理的模块,简化了大数据量处理任务的开发。

Spring Boot Messaging:用于消息传递的模块,包括JMS和Apache Kafka的集成,支持异步消息处理。

Spring Boot Integration:用于与外部系统集成的模块,包括HTTP、FTP、AMQP等。

spring中应用到的设计模式是哪些

依赖注入模式(Dependency Injection):Spring最显著的设计模式之一。通过依赖注入,对象的依赖关系由容器负责管理,而不是在对象内部创建依赖对象。这有助于降低组件之间的耦合,提高代码的可测试性和可维护性。

工厂模式(Factory Pattern):Spring使用工厂模式来创建和管理对象。Bean工厂(如BeanFactory和ApplicationContext)负责创建和配置应用程序中的对象。这使得对象的创建过程可以集中管理,并且可以根据需要生成单例或原型对象。

单例模式(Singleton Pattern):Spring容器管理的默认范围是单例,因此它通过保持一个单一实例来确保应用程序中的某些对象只被创建一次。这有助于节省资源并提高性能。

模板模式(Template Pattern):Spring在JDBC、JMS等模块中使用模板模式。例如,JdbcTemplate为数据库操作提供了一个模板,开发者只需提供自己的回调方法,而模板处理了底层的操作,如连接管理和异常处理。

观察者模式(Observer Pattern):Spring的事件机制基于观察者模式。组件可以发布事件,而其他组件可以监听这些事件并在事件发生时做出响应。

策略模式(Strategy Pattern):Spring的DispatcherServlet使用策略模式来确定请求应该由哪个处理器来处理。开发者可以注册不同的处理策略,以处理不同类型的请求。

适配器模式(Adapter Pattern):Spring的AOP模块使用适配器模式来将切面织入到目标对象中。通过使用代理对象,AOP可以在目标方法执行前后添加额外的行为。

装饰者模式(Decorator Pattern):Spring的@Transactional注解和AOP代理可以视为装饰者模式的应用,它们在方法执行前后添加了事务管理的行为。

建造者模式(Builder Pattern):在Spring中,SpringApplicationBuilder用于创建Spring Boot应用程序的构建器。它提供了链式调用的方式来配置和构建应用程序。

0 人点赞