Spring 面试题汇总-1

174 阅读18分钟

一、Spring 常用的注解有哪些?

1,组件相关

  • @Component : 通用的组件注解,用于标识任何被Spring 管理的组件
  • @Controller  : 用于标识Web 层的控制组件 
  • @Service :用于标识业务逻辑层的组件
  • @Repository :用于标识数据访问层的组件

2,依赖注入相关:

  • @Autowired: 自动装配依赖,通过类型进行注入,如果有多个相同类型的Bean ,可以结合@Qulifier 指定具体要注入的Bean 的名称。
  • @Resource : 依赖注入,通过名称或者类型注入

4,配置相关:

  • @Configuration :标识一个类作为Spring 的配置类,用于定义Bean 和配置 Spring 的各种特性。

  • @Bean : 在@Configuraton 类中使用,用于定义一个具体的Bean

5,事务管理相关

@Transactional : 用于标识一个方法需要事务管理,确保数据的一致性和完整性。

6,属性配置相关

@Value : 用于将外部配置的值注入到Bean 的属性

二、Spring IOC 容器是什么?

Spring的IoC Inversion Of  Control  控制反转 容器是一个负责创建,管理和组装对象的强大工具。

在传统的编程模式中,对象的创建和依赖关系的管理通常由程序自己负责。而在 Spring IoC 容器中,对象的创建和依赖关系的注入由容器来管理,这就是控制反转。

例如,一个业务逻辑类需要依赖一个数据访问对象,在没有 IoC 容器的情况下,业务逻辑类可能需要自己创建数据访问对象。但在 Spring 中,业务逻辑类只需要声明对数据访问对象的依赖,而容器会在运行时自动将数据访问对象注入到业务逻辑类中。这使得代码更加松散耦合,易于测试和维护。

三、spring 依赖注入有哪几种方式? 

1,构造函数注入

  1. 定义

    • 通过在类的构造函数中接收依赖对象作为参数来实现依赖注入。
  2. 示例

    public class MyService { private final MyDao myDao;

    public MyService(MyDao myDao) {
        this.myDao = myDao;
    }
    

    }

  3. 优点

    • 确保在对象创建时所有必需的依赖都被提供,对象处于完整可用状态。
    • 依赖不可变,一旦对象创建,其依赖关系不能被修改。
  4. 缺点

    • 如果一个类有很多依赖,构造函数可能会变得复杂,参数过多。

2,Setter 方法注入(属性注入)

  1. 定义

    • 通过为类的属性提供 setter 方法,并在 setter 方法中接收依赖对象作为参数来实现依赖注入。
  2. 示例

    public class MyService { private MyDao myDao;

    public void setMyDao(MyDao myDao) {
        this.myDao = myDao;
    }
    

    }

  3. 优点

    • 灵活性高,可以在对象创建后根据需要设置依赖。
    • 对于可选的依赖,可以在需要时才进行注入。
  4. 缺点

    • 对象可能在没有完全初始化的状态下被使用,因为依赖可能在对象创建后才被注入。
    • 代码的可读性可能会降低,因为不清楚依赖是何时被注入的。

3,字段注入,基于注解

  1. 定义

    • 使用@Autowired注解直接在类的字段上进行依赖注入。
  2. 示例

    public class MyService { @Autowired private MyDao myDao; }

  3. 优点

    • 简洁方便,减少了代码量。
    • 可以快速地为类的字段注入依赖。
  4. 缺点

    • 过度依赖注解可能会降低代码的可维护性。
    • 如果有多个相同类型的依赖,可能需要结合@Qualifier注解来明确指定要注入的对象。

四、Spring 由那些主要模块组成?

spring 有以下几个模块

1,核心模块Spring Core Container

2,切片模块  AOP

3,web模块

4,数据模块

5,消息模块

6,工具模块

7,测试模块

1、Spring Core Container 核心模块

Spring Core Container 是 Spring 框架的核心部分,它为整个 Spring 框架提供了基础设施和基本功能。Spring Core Container 负责管理 Spring 应用中的所有组件(如 Beans)的创建、配置和生命周期,并通过依赖注入(Dependency Injection, DI)和面向切面编程(Aspect-Oriented Programming, AOP)等机制来促进松散耦合的设计。

一、spring-core

  1. 功能
    • 提供了 Spring 框架的基础功能,是整个框架的核心支撑部分。
    • 实现了控制反转(IoC)和依赖注入(DI)的核心机制,负责对象的创建、管理和装配。
  2. 重要组成部分
    • BeanFactory:Spring 容器的核心接口,用于创建和管理 Bean。它提供了基本的对象创建和依赖注入功能。
    • ResourceLoader:用于加载各种资源,如文件、URL 等。
    • ObjectFactory:用于创建对象的工厂接口,可以根据需要创建不同类型的对象。

二、spring-beans

  1. 功能
    • 定义了 Spring 中 Bean 的概念和配置方式。
    • 负责 Bean 的定义、创建、初始化和销毁等生命周期管理。
  2. 重要组成部分
    • BeanDefinition:用于描述一个 Bean 的定义信息,包括类名、属性、构造函数参数等。
    • BeanPostProcessor:在 Bean 的创建过程中提供了扩展点,可以在 Bean 初始化前后进行自定义的处理。
    • FactoryBean:一种特殊的 Bean,可以创建复杂的对象或者对现有对象进行包装。

三、spring-context

  1. 功能
    • 建立在 spring-core 和 spring-beans 模块的基础上,提供了一种高级的容器功能。
    • 支持企业级应用开发中的各种特性,如国际化、事件传播、资源加载等。
  2. 重要组成部分
    • ApplicationContext:是 spring-context 模块的核心接口,扩展了BeanFactory,提供了更多的企业级功能。
    • MessageSource:用于实现国际化功能,提供了对不同语言和地区的消息的支持。
    • ResourcePatternResolver:用于解析资源路径模式,以便加载多个资源。

四、spring-expression

  1. 功能
    • 提供了一种强大的表达式语言,可以在运行时动态地操作对象、属性和方法。
    • 可以在 Spring 的配置文件中使用表达式语言来进行属性赋值、方法调用等操作。
  2. 重要组成部分
    • ExpressionParser:用于解析表达式语言。
    • EvaluationContext:提供了表达式的执行上下文。
    • SpelExpression:表示一个解析后的表达式,可以在运行时进行求值。

2,切片模块 Spring AOP

一、spring-aop

  1. 功能定位:

    • Spring AOP 提供了面向切面编程的实现,是 Spring 框架中实现横切关注点分离的核心模块。
    • 它允许开发者将诸如日志记录、事务管理、安全检查等横切关注点从业务逻辑中分离出来,提高代码的可维护性和可扩展性。
  2. 实现方式:

    • 主要通过代理模式来实现 AOP,在运行时对目标对象进行增强。可以使用 JDK 动态代理或 CGLIB 代理来创建代理对象。
    • 定义了切面、切点和通知等概念,通过配置这些元素来确定在哪些地方应用横切关注点。

二、spring-aspects

  1. 与 spring-aop 的关系:

    • spring-aspects 模块为与 AspectJ 的集成提供支持。AspectJ 是一个强大的面向切面编程框架。
    • 通过集成 AspectJ,Spring 可以利用 AspectJ 的更高级的 AOP 特性,增强 Spring AOP 的功能。
    • 例如,可以使用 AspectJ 的注解和语法来定义切面,然后在 Spring 容器中使用这些切面。
  2. 功能扩展:

    • 提供了与 AspectJ 的无缝集成,使得开发者可以在 Spring 应用中使用 AspectJ 的强大功能,同时仍然享受 Spring 框架的其他优势。
    • 可以在不修改现有代码的情况下,通过引入 AspectJ 的切面来实现更复杂的横切关注点分离。

3,Spring Web 

一、spring-web

  1. 功能概述
    • 提供了基础的 Web 开发功能,包括对 HTTP 请求和响应的处理、Servlet 容器集成、资源处理等。
    • 为构建 Web 应用程序提供了基础的基础设施支持。
  2. 重要组件
    • HttpMessageConverter:用于在 HTTP 请求和响应中进行对象的序列化和反序列化。
    • ResourceResolver:用于解析资源路径,以便访问静态资源和模板文件。

二、spring-webmvc

  1. 功能概述
    • 实现了经典的 Model-View-Controller(MVC)架构,用于构建传统的同步 Web 应用程序。
    • 提供了丰富的功能,如请求映射、数据绑定、视图解析、异常处理等。
  2. 核心组件
    • DispatcherServlet:Spring WebMVC 的核心 Servlet,负责接收 HTTP 请求并将其分发到相应的控制器进行处理。
    • HandlerMapping:用于将请求 URL 映射到具体的控制器方法。
    • ViewResolver:负责将逻辑视图名解析为实际的视图对象。

三、spring-websocket

  1. 功能概述
    • 提供了对 WebSocket 协议的支持,用于构建实时的双向通信 Web 应用程序。
    • 允许客户端和服务器之间进行全双工通信,实现实时数据推送和交互。
  2. 重要概念
    • WebSocketHandler:用于处理 WebSocket 连接的具体逻辑。
    • WebSocketMessage:表示 WebSocket 消息,可以是文本消息或二进制消息。

四、spring-webflux

  1. 功能概述
    • 基于 Reactive Streams 规范实现,用于构建异步、非阻塞的 Web 应用程序。
    • 支持响应式编程模型,能够高效地处理大量并发请求,提高系统的吞吐量和响应速度。
  2. 核心组件
    • WebHandler:类似于 Spring WebMVC 中的DispatcherServlet,负责接收 HTTP 请求并将其分发到相应的处理函数进行处理。
    • RouterFunction:用于定义请求路由,将请求 URL 映射到具体的处理函数。

关系与区别

  • spring-web是基础模块,为其他三个模块提供了基础的 Web 开发功能支持。
  • spring-webmvc是传统的同步 Web 开发框架,适用于大多数常规的 Web 应用程序开发场景。
  • spring-websocket专注于 WebSocket 通信,提供了实时通信的功能,通常与其他模块结合使用。
  • spring-webflux是异步、非阻塞的 Web 开发框架,适用于对性能和响应速度要求较高的场景,特别是在处理大量并发请求时具有优势。

4,数据模块 Data Access/Integration

Spring 框架中的数据访问 / 集成模块提供了一套全面的工具和抽象,用于与各种数据源进行交互并执行数据集成任务。

一、spring-jdbc

  1. 功能概述

    • Spring JDBC 提供了对 JDBC(Java Database Connectivity)的简化和抽象,使得在 Spring 应用中使用 JDBC 更加方便和高效。
    • 它封装了 JDBC 的一些繁琐操作,如获取数据库连接、处理事务、处理异常等,让开发者可以更专注于业务逻辑的实现。
  2. 核心组件

    • JdbcTemplate:这是 Spring JDBC 的核心类,提供了一系列方便的方法来执行 SQL 语句、查询数据库、更新数据库等操作。它可以自动处理数据库连接的获取和释放,以及事务的管理。
    • NamedParameterJdbcTemplate:基于命名参数的 JDBC 模板,允许使用命名参数来代替传统的问号占位符,提高了 SQL 语句的可读性和可维护性。

二、spring-tx

  1. 功能概述

    • Spring 的事务管理模块,用于处理数据库事务。它提供了一致的编程模型来管理事务,无论底层使用的是 JDBC、Hibernate 还是其他 ORM 框架。
    • 可以通过声明式事务管理或编程式事务管理来控制事务的开始、提交和回滚。
  2. 核心概念

    • PlatformTransactionManager:事务管理器接口,负责管理事务的生命周期。不同的数据库或 ORM 框架有不同的实现,如DataSourceTransactionManager(用于 JDBC)、HibernateTransactionManager(用于 Hibernate)等。
    • TransactionDefinition:定义事务的属性,如事务的隔离级别、传播行为等。
    • TransactionStatus:表示事务的状态,可以用于查询事务的信息和控制事务的执行。

三、spring-orm

  1. 功能概述

    • 提供了对对象关系映射(Object-Relational Mapping,ORM)框架的集成支持,如 Hibernate、MyBatis 等。
    • 简化了 ORM 框架的使用,提供了统一的编程模型和事务管理,使得开发者可以更轻松地在 Spring 应用中使用 ORM 框架进行数据库操作。
  2. 核心组件

    • LocalSessionFactoryBean:用于配置和创建 Hibernate 的SessionFactory
    • SqlSessionFactoryBean:用于配置和创建 MyBatis 的SqlSessionFactory

四、spring-oxm

  1. 功能概述

    • Spring Object/XML Mapping(OXM)模块提供了对象和 XML 之间的映射功能。
    • 可以将 Java 对象序列化为 XML 格式,或者将 XML 数据反序列化为 Java 对象,方便在不同系统之间进行数据交换。
  2. 核心组件

    • MarshallerUnmarshaller:用于对象和 XML 之间的序列化和反序列化操作。Spring 提供了多种实现,如 JAXB(Java Architecture for XML Binding)、Castor、XStream 等。

五、spring-jms

  1. 功能概述

    • Spring 的 Java Message Service(JMS)模块提供了对 JMS 的集成支持,用于在分布式系统中进行异步消息通信。
    • 可以方便地发送和接收 JMS 消息,支持点对点和发布 / 订阅两种消息模式。
  2. 核心组件

    • JmsTemplate:类似于JdbcTemplate,提供了一系列方便的方法来发送和接收 JMS 消息。它可以自动处理 JMS 连接的获取和释放,以及事务的管理。
    • MessageListener:用于接收 JMS 消息的监听器接口,可以实现这个接口来处理接收到的消息。

关系总结

  • spring-jdbc 提供了对 JDBC 的简化和抽象,spring-tx 提供了事务管理功能,可以与 spring-jdbc 一起使用来管理 JDBC 操作的事务。
  • spring-orm 提供了对 ORM 框架的集成支持,而 spring-tx 也可以用于管理 ORM 框架的事务。
  • spring-oxm 用于对象和 XML 之间的映射,与数据库操作没有直接关系,但可以在数据交换场景中与其他模块结合使用。
  • spring-jms 用于异步消息通信,与数据库操作也没有直接关系,但可以在分布式系统中与其他模块协同工作。

5,Messaging

Spring Messaging 是 Spring 框架中的一个模块,主要用于实现消息传递和异步通信。以下是对 Spring Messaging 的详细介绍:

一、功能概述

  1. 消息传递

    • 提供了一种在不同组件之间进行异步通信的方式。通过发送和接收消息,可以实现松耦合的系统架构,提高系统的可扩展性和可维护性。
    • 支持多种消息传递模式,如点对点(Point-to-Point)和发布 / 订阅(Publish/Subscribe)。
  2. 异步通信

    • 允许应用程序在不阻塞主线程的情况下进行通信。当一个组件发送消息时,它可以继续执行其他任务,而不需要等待消息的接收和处理。
    • 这种异步通信方式可以提高系统的响应速度和吞吐量,特别是在处理大量并发请求时非常有用。

二、核心组件

  1. Message

    • 表示一个消息对象,包含了消息的内容和元数据。消息可以是任何类型的对象,如字符串、JSON 数据、自定义对象等。
    • 消息的元数据包括消息的头部信息(如消息类型、发送者、接收者等)和属性(如消息的优先级、过期时间等)。
  2. MessageChannel

    • 消息通道,用于发送和接收消息。它是消息传递的核心组件,负责将消息从发送者传递到接收者。
    • 可以将消息通道看作是一个管道,发送者将消息放入管道中,接收者从管道中取出消息进行处理。
    • Spring Messaging 支持多种类型的消息通道,如DirectChannel(点对点通道)、PublishSubscribeChannel(发布 / 订阅通道)等。
  3. MessageHandler

    • 消息处理器,用于处理接收到的消息。它是一个接口,定义了处理消息的方法。
    • 当一个消息到达消息通道时,Spring Messaging 会将消息传递给注册的消息处理器进行处理。
    • 可以根据不同的业务需求实现不同的消息处理器,对消息进行相应的处理操作。

6,工具模块Instrumentation

Spring Instrumentation 是 Spring 框架中的一个模块,主要用于在特定的应用服务器环境中为 JVM 添加代理(agent),以实现一些特定的功能。

功能特点

  1. 类加载增强

    • 在特定的应用服务器环境中,Spring Instrumentation 可以为类加载器提供额外的功能。例如,在 Tomcat 中,它可以为 Tomcat 传递类文件,就像这些文件是被类加载器加载的一样。
    • 这种类加载增强功能可以用于在运行时动态地修改类的行为,实现一些特定的功能,如性能监控、字节码增强等。
  2. 应用服务器集成

    • Spring Instrumentation 通常与特定的应用服务器进行集成,以实现特定的功能。例如,在 WebLogic 或 WebSphere 等应用服务器中,Spring Instrumentation 可以与应用服务器的管理控制台进行集成,以实现对应用程序的性能监控和管理。
  3. 字节码增强

    • Spring Instrumentation 可以使用字节码增强技术来修改已有的类的字节码,以实现一些特定的功能。例如,可以使用字节码增强技术来实现 AOP(面向切面编程),在不修改源代码的情况下,为已有类添加新的功能。

使用场景

  1. 性能监控

    • Spring Instrumentation 可以用于在应用服务器环境中实现性能监控。通过在 JVM 中添加代理,可以实时地收集应用程序的性能数据,如 CPU 使用率、内存使用率、线程数量等。
    • 这些性能数据可以用于分析应用程序的性能瓶颈,优化应用程序的性能。
  2. 字节码增强

    • Spring Instrumentation 可以用于在不修改源代码的情况下,为已有类添加新的功能。例如,可以使用字节码增强技术来实现 AOP,在方法执行前后添加日志记录、性能监控等功能。
  3. 应用服务器集成

    • Spring Instrumentation 可以与特定的应用服务器进行集成,以实现特定的功能。例如,在 WebLogic 或 WebSphere 等应用服务器中,Spring Instrumentation 可以与应用服务器的管理控制台进行集成,以实现对应用程序的性能监控和管理。

7,测试模块test

Spring Test 是 Spring 框架中用于测试的模块。

功能特点

  1. 集成测试支持
    • 提供了对集成测试的强大支持。可以轻松地测试 Spring 应用程序中的各个组件之间的交互。
    • 能够模拟各种 Spring 容器中的组件,如服务、控制器、数据访问层等,以便在测试环境中进行集成测试。
  2. 单元测试支持
    • 也适用于单元测试。可以使用 Spring Test 的注解和工具来简化单元测试的编写。
    • 例如,使用@SpringBootTest注解可以在单元测试中启动一个 Spring Boot 应用程序的上下文,以便测试特定的组件。
  3. 测试工具和注解
    • 提供了一系列的测试工具和注解,使得测试更加方便和高效。
    • 例如,@MockBean注解可以用于模拟 Spring 容器中的 bean,以便在测试中进行隔离测试。@Test注解用于标记测试方法,@Before@After注解用于在测试方法执行前后执行特定的代码。
  4. 数据库测试支持
    • 对于涉及数据库的应用程序,Spring Test 提供了对数据库测试的支持。
    • 可以使用@Transactional注解来确保测试在事务中执行,以便在测试结束后回滚数据库的更改。还可以使用@Sql注解来执行特定的 SQL 脚本,以便在测试前或测试后初始化或清理数据库。
  5. Web 测试支持
    • 对于 Web 应用程序,Spring Test 提供了对 Web 测试的支持。
    • 可以使用@WebMvcTest注解来测试 Spring MVC 控制器,模拟 HTTP 请求并验证响应。还可以使用@WebFluxTest注解来测试 Spring WebFlux 应用程序。

使用场景

  1. 集成测试
    • 在开发过程中,进行集成测试以确保各个组件之间的交互正常。
    • 例如,测试服务层与数据访问层之间的集成,或者测试控制器与服务层之间的集成。
  2. 单元测试
    • 对单个组件进行单元测试,以确保其功能正常。
    • 例如,测试一个服务类的方法,或者测试一个数据访问对象的查询方法。
  3. 数据库测试
    • 对于涉及数据库的应用程序,进行数据库测试以确保数据库操作的正确性。
    • 例如,测试数据的插入、更新和删除操作,以及验证数据库的事务处理。
  4. Web 测试
    • 对于 Web 应用程序,进行 Web 测试以确保 Web 界面的功能正常。
    • 例如,测试 HTTP 请求的处理和响应的生成,以及验证 Web 界面的交互性。