其他资料
每日速记10道java面试题01-CSDN博客
每日速记10道java面试题02-CSDN博客
每日速记10道java面试题03-CSDN博客
每日速记10道java面试题04-CSDN博客
每日速记10道java面试题05-CSDN博客
每日速记10道java面试题06-CSDN博客
每日速记10道java面试题07-CSDN博客
每日速记10道java面试题08-CSDN博客
每日速记10道java面试题09-CSDN博客
每日速记10道java面试题10-CSDN博客
每日速记10道java面试题11-CSDN博客
每日速记10道java面试题12-CSDN博客
每日速记10道java面试题13-CSDN博客
每日速记10道java面试题14-CSDN博客
每日速记10道java面试题15-CSDN博客
每日速记10道java面试题16-CSDN博客
每日速记10道java面试题17-CSDN博客
每日速记10道java面试题18-CSDN博客
每日速记10道java面试题19-CSDN博客
每日速记10道java面试题20-CSDN博客
每日速记10道java面试题21-CSDN博客
每日速记10道java面试题22-CSDN博客
目录
1.Spring和Spring MVC的区别是什么?
2.Spring WebFlux 是什么?它与 Spring MVC 有何不同?
3.介绍一下Spring MVC的核心组件?
4.说一说Springboot的启动流程
5.为什么使用springboot
6.SpringBoot是如何实现自动装配的?
7.Spring Boot 打成的 jar 和普通的 jar 有什么区别 ?
8.在 Spring Boot 中你是怎么使用拦截器的?
9.SpringBoot(Spring)中为什么不推荐使用 @Autowired ?
10.怎么理解SpringBoot中的约定大于配置?
1.Spring和Spring MVC的区别是什么?
Spring 是基础,Spring MVC 构建于 Spring 核心之上,利用其提供的容器管理、依赖注入、AOP 等功能来实现 Web 层的处理。
Spring MVC 通过前端控制器(DispatcherServlet)拦截所有的请求,并将请求分发给合适的控制器进行处理:
1.DispatcherServlet 拦截请求。
2. HandlerMapping 根据请求 URL 查找对应的控制器。
3.Controller 处理业务逻辑,并返回数据。
4.ViewResolver 决定渲染哪个视图模板。
5.将响应返回给客户端。
2.Spring WebFlux 是什么?它与 Spring MVC 有何不同?
Spring WebFlux:
- 异步非阻塞框架:Spring WebFlux 是 Spring5引入的响应式 Web 框架,旨在支持异步非阻塞编程模型。
- 基于 Reactor: Webflux基于 Reactor 库,支持响应式流(Reactive Streams)规范,使用 Mono 和 Flux 来表示单个和多个异步序列。
- 适用于高并发:WebFlux 适用于需要处理大量并发请求的场景,如实时数据流和高负载应用。
Spring MVC:
- 同步阻塞框架:Spring MVC 是一个基于 Servlet 的传统 Web 框架,使用同步阻塞模型处理请求
- 基于 Servlet APl:Spring MVC 使用标准的 Servlet API,通常每个请求对应一个线程。
- 广泛应用:Spring MVC 适用于大多数 Web 应用,特别是传统的 CRUD 操作和企业应用。
适用场景:
- Spring MVc:适用于 I/O操作较少、请求数相对较少的应用。
- Spring WebFlux:适用于I/O操作频繁、高并发、低延迟的应用。
3.介绍一下Spring MVC的核心组件?
1.DispatcherServlet:Spring MVC 的前端控制器,所有请求都会先由它接收并分发到相应的处理器。它是整个 Spring MVC 流程的入口,也是处理请求的调度中心。
2.HandlerMapping:根据请求 URL查找对应的处理器(Controller)。 HandlerMapping 用于将客户端的请求映射到具体的控制器方法。
3.Controller (控制器):负责处理用户请求的核心组件。Controller 接收请求后,调用业务逻辑处理,返回数据给前端
4.ModelAndView:Controller 返回的对象,包含模型数据和视图信息,表示返回给用户的页面或 AP! 响应。
5.ViewResolver:用于解析视图名称并找到实际的视图(如JSP、Thymeleaf等),然后将处理结果渲染为 HTML 或其他格式,发送给客户端。
6. Handlerinterceptor(拦截器):在请求处理的各个阶段拦截 HTTP 请求和响应,可以在控制器执行前后添加自定义逻辑,如日志记录、权限检查等。
7.HandlerAdapter:负责执行找到的处理器(Controller),将请求交给处理器进行业务逻辑的处理。
核心工作流程:
1.DispatcherServlet 接收请求并调用 HandlerMapping 查找对应的控制器
2.HandlerAdapter 调用具体的 Controller 方法处理请求.。
3.Controller 返回 ModelAndView,包括视图名和模型数据。
4.ViewResolver 解析视图并渲染结果。
5.最终,DispatcherServlet 将处理结果返回给客户端
4.说一说Springboot的启动流程
1.从main方法启动,调用SpringApplication.run()方法
2.先会创建SpringApplication对象,创建的时候会推断应用类型(判断是servlet应用,还是reactive应用,或者不是web应用)设置启动监听器
3.创建完SpringApplication之后,调用该对象的run方法,通过ConfigurableEnvironment准备环境,这一步会读取配置文件,例application.preperties
4.创建应用上下文,这一步会注册所有配置类和自动配置类
5.刷新应用上下文,这一步会进行bean的创建和初始化,包括开发者自定义的bean以及自动注入的bean
6.对于web应用,刷新应用上下文的最后,会自动启动嵌入式web服务器
7.服务器启动完成会发送应用已启动的事件
8.接着调用实现了CommandLineRunner或者ApplicationRunner接囗的bean,执行一些初始化逻辑9.发送ApplicationReadyEvent,应用启动完成
核心步骤如下:
1.SpringApplication.run(:这是启动的入口,它会创建 Spring 应用上下文,并执行自动配置。
2.创建应用上下文:为 Web 应用创建 AnnotationConfigServletWebServerApplicationContext 上下文.
3.启动内嵌 Web 服务器:在 refreshContext() 阶段启动内嵌的 Web 服务器(如 Tomcat)。
4.自动配置:通过 @EnableAutoConfiguration 自动配置各种组件,如 DispatcherServlet。
5.请求处理:内嵌的 DispatcherServlet 负责处理 HTTP 请求。
5.为什么使用springboot
- 简化开发:Spring Boot通过提供一系列的开箱即用的组件和自动配置,开发人员可以更专注于业务逻辑的实现,而不需要花费过多时间在繁琐的配置上。
- 快速启动:springboot可通过内嵌的Tomcat等容器快速启动应用程序,无需额外的部署步骤,方便快捷。
- 自动化配置:Spring Boot通过自动配置功能,根据项目中的依赖关系和约定俗成的规则来配置应用程序,减少了配置的复杂性,简化开发。
6.SpringBoot是如何实现自动装配的?
自动配置是通过@EnableAutoConfiguration注解实现的,这个注解会通过@import注解导入AtuoConfigurationlmportSelector类,这个类会扫描META-INF/Spring.factories文件,这个文件里面定义了所有的自动配置类,这些配置类上可能存在条件注解spring boot启动的时候根据这些注解,加载这些自动配置类。
1.自定义自动配置类步骤
定义一个类使用configuration注解修饰;定义META-INF/Spring-factories文件,向EnableAutoConfiguration中注入这个类
2.禁用特定的自动配置
application.properties配置文件中,使用spring.autoconfigure.exclude指定要禁用的自动配置类main启动类上,使用@SpringBootApplication的exclue属性进行排除
7.Spring Boot 打成的 jar 和普通的 jar 有什么区别 ?
spring boot的jar除了包含源代码以及依赖之外,还包含运行所需要的环境,例如Tomcat服务器和运行代码所需要的依赖,能独立运行。
普通的jar只有源代码和依赖,不能直接独立运行。怎么打包?使用maven插件,运行mvn clean package命令
8.在 Spring Boot 中你是怎么使用拦截器的?
1.实现Handlerlnterceptor接口,并且实现preHandle,postHandle,afterCompletion方法
2.实现WebMvcConfigurer接口,并且实现addInterceptors方法,注入上面自定义的拦截器
常用于:权限校验,日志记录等
preHandle:在请求到达控制器之前,进行拦截处理。常用与权限校验
postHandle:在请求经过控制器处理,还没有进行染视图之前。可以对响应进行修改afterCompletion:在视图完成渲染之后。可以用于进行一些清理操作。
多个拦截器调用顺序:preHandle会根据拦截器定义的顺序,依次进行调用。postHandle和afterCompletion会按照定义的顺序逆序进行调用。
Filter和Interceptor区别:Filter优先级比Interceptor高
9.SpringBoot(Spring)中为什么不推荐使用 @Autowired ?
详情请看我的另一篇文章:@Autowired与构造器注入区别,为什么spring推荐使用构造注入而不是Autowired?_构造器注入和autowired区别-CSDN博客
10.怎么理解SpringBoot中的约定大于配置?
- 自动化配置:Spring Boot 提供了大量的自动化配置,通过分析项目的依赖和环境,自动配置应用程序的行为。例如,Spring Boot 可以根据项目中引入的数据库依赖自动配置数据源。
- 默认配置:Spring Boot 在没有明确配置的情况下,会使用合理的默认值来初始化应用程序。
- 约定优于配置:Spring Boot 遵循了约定优于配置的设计哲学,即通过约定好的方式来提供默认行为,减少开发者需要做出的决策。它是一种设计理念,通过减少配置和提供合理的默认值,让开发者快速构建部署一个程序,简化开发和降低维护成本。