spring 经典的高频面试题

本文深入探讨Spring框架的八大核心优势,包括简化开发、依赖注入、模块化设计、兼容成熟框架、自带测试组件、SpringWebMVC、声明式事务及IOC容器管理。同时,解析BeanFactory与ApplicationContext的区别,SpringBean的生命周期与作用域,以及线程安全性和设计模式的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.使用spring框架能给我们带来的好处

1.1.简化开发

1.简化程序员的开发,简化业务开发

1.2.DI 依赖关系,一目了然

能够从配置文件,可以看出对象与对象的依赖关系,一目了然

1.3.IOC

1.在有限的内存,有限的资源情况下,能够管理好Bean;
2.分阶段,分层次帮忙管理

1.4.万能胶

1.能够兼容成熟的框架:
  Hibernate、MyBatis、Quartz[定时器]、Timer[JDK的]、Shiro、Spring Data,redis,MongoDB等等

1.5.模块化设计

1.即插即用,按需分配,需要啥用啥

在这里插入图片描述

1.6.自带测试组件:JUnit,Spring Test

1.7.Spring Web MVC

1.之前的Struts等有过度设计的嫌疑;
2.Spring MVC 完整分离了Servlet和普通Bean

如:

	@GetMapping("/preview.json")
	@ResponseBody
	public Flux<Member> preview(HttpServletRequest request, HttpServletResponse response){

		return null;
	}

没有必要一定是HttpServletRequest 和 HttpServletResponse

如下面:

	@GetMapping(value="/getByName.json")
	@ResponseBody
	public Mono<Member> getByName(@RequestParam String name){
		Member member = new Member();
		member.setName(name);
		return Mono.justOrEmpty(member);
	}

1.8.声明式事务

1.之前事务都是人为管理,自己开启,自己关闭;
2.spring将非功能性代码[非业务性代码]和功能性代码[业务性代码]分离,提出事务管理提前声明;
  事务管理提前声明:通过不同的切面实现不同的事务模型,达到代码运行以前事先配置好的效果,
                 而不是运行的时候,再去创建,降低了维护成本.

2.BeanFactory和ApplicationContext区别

2.1.ApplicationContext是BeanFactory子接口

2.2.ApplicationContext提供IOC容器中的Bean监控

1.这里的监控主要是指Bean的生命周期:Bean创建 销毁等等;

下面的了解即可
PostProcessor机制
Aware
举例

   ApplicationEvent
   ContextRefreshedEvent
   ContextStartedEvent 容器开始启动的时候触犯
   ContextStoppedEvent 容器终止的时候触发
   ContextClosedEvent 容器被关闭的时候触发 |所有bean被销毁的时候触发
   RequestHandleredEvent web容器请求结束的时候触发

2.2.ApplicationContext支持国际化i18n

2.3.ApplicationContext拓展了统一资源文件读取方式URL

1.这里的Url 可以是一个本地URL,也可以是一个网络URL
2.三种形式:
	ClassPathXmlApplicationContext:处理本地classpath下面的所有的配置文件的IOS容器
   	FileSystemXmlApplicationContext:处理文件系统在其他磁盘下的Url
   	XmlWebApplicationContext:加载网络文件的配置信息
3.另外AnnotationConfigApplicationContext:加载注解

3.Spring Bean的生命周期

1、初始化的时候回调调用:InitializingBean和DisposableBean用来回调
2、Aware接口
3init() destory()
4@PostContruct@PreDestory注解方式

4.Spring Bean各作用域的区别

1.总共5个范围:对象什么时候创建,什么时候销毁

4.1.singleton

1.我从容器启动就从石头缝里蹦出来,直到Spring的世界末日才灭亡

4.2.prototype

1.什么时候用,什么出生,用完就死了

4.3.request

1.request出生的时候就出生,request销毁的时候就销毁(request)
2.这个属于web层
3.用户发起请求的时候就有了,用户拿到结果的时候就销毁了
4.对于单一的请求,你可以认为是单例,但是对于spring请求中,每个又不一样,可以认为是多例;

4.4.session

1.session出生的时候就出生,session销毁的时候就销毁(session)

4.5.global-session

1.可以理解为上下文Context;一个全局的web容器

总结:5中作用域的长短[用时间长短去比较]

100岁:singleton
80岁:global-session Context
20岁:session
10岁:request
1岁: prototype

5.Spring的Bean是线程安全的吗?

1.Spring Bean 由IOC容器来创建;
2.创建的对象时用我们开发人员自己写的
3.定义 BeanDefinition BeanWarpper   instance   Class.newInstance(); new Object();
4.Map<String,BeanWarpper> 顶多就是做了一次代理,用一个新的类代替了原来的类
  跟我们写的代码有关系,跟Spring无关,
  自己写的是不是线程安全,那就是线程安全的,
  如果写的代码不是安全的,那就不是线程安全的;

6.Spring中用到了哪些设计模式?

7.Spring是如何处理循环依赖的?

class A 依赖,class B,Class B 依赖Class A;

用缓存机制来解决循环依赖的问题
BeanWrapper

A在加载的时候,发现B还没有实例化,会缓存在BeanWrapper中,等有了之后

8.Service层如何获得ApplicationContext

推荐接口ApplicationContextAware
实现即可
在这里插入图片描述

9.如何理解上下文

作用域问题
所处的运行环境;
Tomcat

### Spring Cloud 常见面试题及解答 #### 1. Spring Cloud 是什么? Spring Cloud 是一套基于 Spring Boot 实现的云应用开发工具集,它提供了一系列组件来解决分布式系统中的常见问题,例如服务注册与发现、配置管理、服务通信、负载均衡、断路器、网关等。Spring Cloud 的目标是简化微服务架构的开发和部署,使开发者能够更专注于业务逻辑的实现,而不是基础设施的复杂性。 #### 2. Spring Cloud 的主要组件有哪些?分别解释它们的作用 - **Eureka(服务注册与发现)**:Eureka 是 Netflix 提供的服务注册与发现组件,服务启动后会向 Eureka 注册自身信息(如 IP 地址、端口等),其他服务可以通过 Eureka 查找并调用已注册的服务。 - **Ribbon(客户端负载均衡)**:Ribbon 是一个客户端负载均衡器,它可以根据不同的策略(如轮询、随机等)将请求分发到多个服务实例上,从而提高系统的可用性和伸缩性。 - **Feign(声明式 REST 客户端)**:Feign 是一个声明式的 REST 客户端,它简化了服务间的 HTTP 通信,开发者只需定义接口即可完成服务调用。 - **Hystrix(断路器)**:Hystrix 是一个容错管理组件,它通过断路机制来防止服务雪崩。当某个服务调用失败或超时时,Hystrix 会自动切换到降级逻辑,避免整个系统崩溃。 - **Zuul(API 网关)**:Zuul 是 Netflix 提供的 API 网关组件,它负责路由请求、过滤、限流、认证等功能,是外部请求进入系统的统一入口。 - **Config(分布式配置中心)**:Spring Cloud Config 提供了集中化的配置管理功能,支持从 Git 或 SVN 等版本控制系统中获取配置信息,方便在不同环境中动态调整配置。 - **Sleuth(分布式链路追踪)**:Spring Cloud Sleuth 用于追踪微服务之间的调用链,帮助开发者分析请求在系统中的流转路径,便于排查问题。 - **Zipkin(分布式链路追踪)**:Zipkin 是一个分布式链路追踪系统,它可以与 Sleuth 集成,提供可视化的调用链分析界面。 #### 3. Spring Cloud Stream 是什么?它在微服务架构中的作用是什么? Spring Cloud Stream 是一个用于构建消息驱动的微服务应用的框架,它基于 Spring Boot 和 Spring Integration,简化了与消息中间件(如 Kafka、RabbitMQ)的集成。Spring Cloud Stream 提供了一种统一的编程模型,使得开发者可以轻松地编写生产者和消费者代码,并通过绑定器(Binder)抽象出底层的消息系统差异。它在微服务架构中的作用主要包括: - 实现服务间的异步通信,提升系统的解耦能力; - 支持多种消息中间件,增强系统的灵活性; - 提供持久化消息处理、消息分区、错误处理等功能,增强系统的可靠性和可扩展性。 #### 4. Spring Cloud Stream 的编程模型特点是什么?它如何简化消息处理? Spring Cloud Stream 的编程模型主要基于函数式编程风格,支持使用 `Supplier`、`Consumer` 和 `Function` 等函数式接口来定义消息的生产者和消费者。这种模型简化了消息处理的代码编写,开发者只需关注业务逻辑,而无需关心底层的消息传输细节。此外,Spring Cloud Stream 还支持通过注解(如 `@EnableBinding`)来定义消息通道,进一步降低了开发复杂度。 #### 5. Spring Cloud Stream 中的绑定器(Binder)是什么?常见的绑定器有哪些? 绑定器(Binder)是 Spring Cloud Stream 中的一个核心概念,它负责将消息通道(Channel)与具体的消息中间件(如 Kafka、RabbitMQ)进行绑定。绑定器抽象了底层消息系统的实现细节,使得开发者可以使用统一的 API 来操作不同的消息中间件。常见的绑定器包括: - `spring-cloud-stream-binder-kafka`:用于与 Apache Kafka 集成; - `spring-cloud-stream-binder-rabbit`:用于与 RabbitMQ 集成; - `spring-cloud-stream-binder-redis`:用于与 Redis 消息队列集成。 #### 6. 消息通道(Channel)在 Spring Cloud Stream 中的作用是什么?请给出一个配置示例。 消息通道(Channel)是 Spring Cloud Stream 中用于传输消息的核心抽象,它定义了消息的输入和输出方向。开发者可以通过定义 `Source`、`Sink` 和 `Processor` 接口来声明消息通道,并通过配置文件(如 `application.yml`)指定绑定器和消息中间件的相关参数。以下是一个简单的配置示例: ```yaml spring: cloud: stream: bindings: output: destination: my-topic binder: rabbit ``` 在这个示例中,`output` 是一个输出通道,消息将被发送到名为 `my-topic` 的 Kafka 主题或 RabbitMQ 队列中,具体取决于绑定器的类型。 #### 7. 如何在 Spring Cloud Stream 中配置持久性消息? 在 Spring Cloud Stream 中,持久性消息的配置通常依赖于所使用的绑定器。以 RabbitMQ 为例,可以通过以下配置启用持久化消息: ```yaml spring: cloud: stream: rabbit: bindings: output: producer: durable: true ``` 该配置确保消息在 RabbitMQ 中被持久化存储,即使在消费者暂时不可用的情况下也不会丢失。 #### 8. 什么是消息分区?在 Spring Cloud Stream 中如何实现? 消息分区是指将消息按照某种规则分发到不同的消费者实例上,以确保同一类消息总是被同一个消费者处理。在 Spring Cloud Stream 中,可以通过配置 `partitionKeyExpression` 和 `partitionCount` 来实现消息分区。例如: ```yaml spring: cloud: stream: bindings: input: consumer: partitioned: true instanceCount: 3 instanceIndex: 0 ``` 该配置表示有 3 个消费者实例,并且每个实例只处理属于自己的分区消息。 #### 9. Spring Cloud Stream 如何处理消息消费过程中的错误? Spring Cloud Stream 提供了多种错误处理机制,包括: - **重试机制**:可以通过配置 `maxAttempts` 和 `backOffInitialInterval` 来设置消息消费失败后的重试次数和间隔时间; - **死信队列(DLQ)**:当消息多次消费失败后,可以将其发送到死信队列,以便后续人工处理; - **自定义错误处理器**:开发者可以通过实现 `MessageHandler` 接口来自定义错误处理逻辑。 #### 10. 消息序列化和反序列化在 Spring Cloud Stream 中是如何工作的?可以自定义吗? Spring Cloud Stream 默认使用 `SimpleMessageConverter` 来处理消息的序列化和反序列化,支持 JSON、文本等多种格式。开发者可以通过自定义 `MessageConverter` 来实现特定的序列化和反序列化逻辑。例如: ```java @Bean public MessageConverter customMessageConverter() { return new MyCustomMessageConverter(); } ``` 通过这种方式,开发者可以根据业务需求灵活地控制消息的格式转换过程。 #### 11. 如何在 Spring Cloud Stream 中实现动态消息路由? 动态消息路由可以通过使用 `Router` 组件来实现。开发者可以定义一个 `Router` 函数,根据消息的内容动态决定消息应该被发送到哪个通道。例如: ```java @Bean public Function<Message<?>, String> router() { return message -> { // 根据消息内容决定路由目标 if (message.getPayload() instanceof String) { return "stringChannel"; } else { return "defaultChannel"; } }; } ``` #### 12. 如何在 Spring Cloud Stream 中使用多种数据源或触发器? Spring Cloud Stream 支持多数据源或多触发器的场景,开发者可以通过定义多个绑定器来连接不同的消息中间件。例如,可以同时使用 Kafka 和 RabbitMQ 作为消息传输的载体,并通过配置文件指定每个通道使用的绑定器。 #### 13. 如何测试 Spring Cloud Stream 应用? 测试 Spring Cloud Stream 应用可以通过以下方式进行: - **单元测试**:使用 `@SpringBootTest` 注解加载完整的 Spring 上下文,并模拟消息的生产和消费; - **集成测试**:使用嵌入式的消息中间件(如 Kafka 嵌入式服务器)来模拟真实的消息传输环境; - **Mockito 模拟**:使用 Mockito 模拟消息通道的行为,验证消息是否正确地被处理。 #### 14. Spring Cloud Stream 与 Spring Integration 有什么关系和区别? Spring Cloud Stream 是基于 Spring Integration 构建的,它继承了 Spring Integration 的许多特性,如消息通道、消息处理器等。两者的区别在于: - **Spring Integration**:主要用于构建企业级集成应用,支持点对点、发布/订阅等多种消息模式,适用于传统的单体应用; - **Spring Cloud Stream**:专注于微服务架构下的消息驱动应用开发,提供了更高层次的抽象和更简洁的编程模型,适合云原生环境。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

东山富哥

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

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

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

打赏作者

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

抵扣说明:

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

余额充值