失效链接处理 |
SpringBoot 常见面试题总结 PDF 下载
本站整理下载:
相关截图:
主要内容:
市⾯上关于 Spring Boot 的⾯试题抄来抄去,毫⽆价值可⾔。
这篇⽂章,我会简单就⾃⼰这⼏年使⽤ Spring Boot 的⼀些经验,总结⼀些常⻅
的⾯试题供⼩伙伴们⾃测和学习。少部分关于 Spring/Spring Boot 的介绍参考
了官⽹,其他皆为原创。
Spring 是重量级企业开发框架 Enterprise JavaBean(EJB) 的替代品,
Spring 为企业级 Java 开发提供了⼀种相对简单的⽅法,通过 依赖注⼊ 和 ⾯向
切⾯编程 ,⽤简单的 Java 对象(Plain Old Java Object,POJO) 实现了 EJB
的功能
虽然 Spring 的组件代码是轻量级的,但它的配置却是重量级的(需要⼤量 XML
配置) 。
为此,Spring 2.5 引⼊了基于注解的组件扫描,这消除了⼤量针对应⽤程序⾃身
组件的显式 XML 配置。Spring 3.0 引⼊了基于 Java 的配置,这是⼀种类型安全
的可重构配置⽅式,可以代替 XML。
尽管如此,我们依旧没能逃脱配置的魔⽖。开启某些 Spring 特性时,⽐如事务
管理和 Spring MVC,还是需要⽤ XML 或 Java 进⾏显式配置。启⽤第三⽅库时
也需要显式配置,⽐如基于 Thymeleaf 的 Web 视图。配置 Servlet 和过滤器
(⽐如 Spring 的 DispatcherServlet )同样需要在 web.xml 或 Servlet 初始
化代码⾥进⾏显式配置。组件扫描减少了配置量,Java 配置让它看上去简洁不
少,但 Spring 还是需要不少配置。
光配置这些 XML ⽂件都够我们头疼的了,占⽤了我们⼤部分时间和精⼒。除此
之外,相关库的依赖⾮常让⼈头疼,不同库之间的版本冲突也⾮常常⻅。
Spring 旨在简化 J2EE 企业应⽤程序开发。Spring Boot 旨在简化 Spring 开发
(减少配置⽂件,开箱即⽤!)。
1. 开发基于 Spring 的应⽤程序很容易。
2. Spring Boot 项⽬所需的开发或⼯程时间明显减少,通常会提⾼整体⽣产
⼒。
3. Spring Boot 不需要编写⼤量样板代码、XML 配置和注释。
4. Spring 引导应⽤程序可以很容易地与 Spring ⽣态系统集成,如 Spring
JDBC、Spring ORM、Spring Data、Spring Security 等。
5. Spring Boot 遵循“固执⼰⻅的默认配置”,以减少开发⼯作(默认配置可以
修改)。
6. Spring Boot 应⽤程序提供嵌⼊式 HTTP 服务器,如 Tomcat 和 Jetty,可以
轻松地开发和测试 web 应⽤程序。(这点很赞!普通运⾏ Java 程序的⽅式
就能运⾏基于 Spring Boot web 项⽬,省事很多)
7. Spring Boot 提供命令⾏接⼝(CLI)⼯具,⽤于开发和测试 Spring Boot 应⽤
程序,如 Java 或 Groovy。
8. Spring Boot 提供了多种插件,可以使⽤内置⼯具(如 Maven 和 Gradle)开发
和测试 Spring Boot 应⽤程序。
Spring Boot Starters 是⼀系列依赖关系的集合,因为它的存在,项⽬的依赖之
间的关系对我们来说变的更加简单了。
举个例⼦:在没有 Spring Boot Starters 之前,我们开发 REST 服务或 Web 应
⽤程序时; 我们需要使⽤像 Spring MVC,Tomcat 和 Jackson 这样的库,这些依
赖我们需要⼿动⼀个⼀个添加。但是,有了 Spring Boot Starters 我们只需要⼀
个只需添加⼀个spring-boot-starter-web⼀个依赖就可以了,这个依赖包含的
⼦依赖中包含了我们开发 REST 服务需要的所有依赖。
Spring Boot ⽀持以下嵌⼊式 Servlet 容器:
您还可以将 Spring 引导应⽤程序部署到任何 Servlet 3.1+兼容的 Web 容器中。
这就是你为什么可以通过直接像运⾏ 普通 Java 项⽬⼀样运⾏ SpringBoot 项
⽬。这样的确省事了很多,⽅便了我们进⾏开发,降低了学习难度。
Spring Boot ( spring-boot-starter-web )使⽤ Tomcat 作为默认的嵌⼊
式 servlet 容器, 如果你想使⽤ Jetty 的话只需要修改 pom.xml (Maven)或者 bu
ild.gradle (Gradle)就可以了。
Maven:
Gradle:
说个题外话,从上⾯可以看出使⽤ Gradle 更加简洁明了,但是国内⽬前还是
Maven 使⽤的多⼀点,我个⼈觉得 Gradle 在很多⽅⾯都要好很多。
可以看出⼤概可以把 @SpringBootApplication 看作是
@Configuration 、 @EnableAutoConfiguration 、 @ComponentScan
注解的集合。根据 SpringBoot 官⽹,这三个注解的作⽤分别是:
@EnableAutoConfiguration :启⽤ SpringBoot 的⾃动配置机制
@ComponentScan : 扫描被 @Component ( @Service , @Controller
)注解的 bean,注解默认会扫描该类所在的包下所有的类。
@Configuration :允许在上下⽂中注册额外的 bean 或导⼊其他配置类
这个是因为 @SpringBootApplication 注解的原因,在上⼀个问题中已经提
到了这个注解。我们知道 @SpringBootApplication 看作是 @Configurati
on 、 @EnableAutoConfiguration 、 @ComponentScan 注解的集合。
@EnableAutoConfiguration :启⽤ SpringBoot 的⾃动配置机制
@ComponentScan : 扫描被 @Component ( @Service , @Controller
)注解的 bean,注解默认会扫描该类所在的包下所有的类。
@Configuration :允许在上下⽂中注册额外的 bean 或导⼊其他配置类
@EnableAutoConfiguration 是启动⾃动配置的关键,源码如下(建议⾃⼰打
断点调试,⾛⼀遍基本的流程):
@EnableAutoConfiguration 注解通过 Spring 提供的 @Import 注解导⼊
了 AutoConfigurationImportSelector 类( @Import 注解可以导⼊配置
类或者 Bean 到当前类中)。
AutoConfigurationImportSelector 类中 getCandidateConfiguration
s ⽅法会将所有⾃动配置类的信息以 List 的形式返回。这些配置信息会被
Spring 容器作 bean 来管理。
⾃动配置信息有了,那么⾃动配置还差什么呢?
@Conditional 注解。 @ConditionalOnClass (指定的类必须存在于类路径
下), @ConditionalOnBean (容器中是否有指定的 Bean)等等都是对 @Conditi
onal 注解的扩展。
拿 Spring Security 的⾃动配置举个例⼦: SecurityAutoConfiguration 中导
⼊了 WebSecurityEnablerConfiguration 类, WebSecurityEnablerCon
figuration 源代码如下:
WebSecurityEnablerConfiguration 类中使⽤ @ConditionalOnBean 指
定了容器中必须还有 WebSecurityConfigurerAdapter 类或其实现类。所
以,⼀般情况下 Spring Security 配置类都会去实现 WebSecurityConfigurer
Adapter ,这样⾃动将配置就完成了。
Spring Bean 相关:
@Autowired : ⾃动导⼊对象到类中,被注⼊进的类同样要被 Spring 容器
管理。
@RestController : @RestController 注解是 @Controller和 @ Re
sponseBody 的合集,表示这是个控制器 bean,并且是将函数的返回值直 接
填⼊ HTTP 响应体中,是 REST ⻛格的控制器。
@Component :通⽤的注解,可标注任意类为 Spring 组件。如果⼀个
Bean 不知道属于哪个层,可以使⽤ @Component 注解标注。
@Repository : 对应持久层即 Dao 层,主要⽤于数据库相关操作。
@Service : 对应服务层,主要涉及⼀些复杂的逻辑,需要⽤到 Dao 层。
@Controller : 对应 Spring MVC 控制层,主要⽤于接受⽤户请求并调⽤
Service 层返回数据给前端⻚⾯。
处理常⻅的 HTTP 请求类型:
@GetMapping : GET 请求、
@PostMapping : POST 请求。
@PutMapping : PUT 请求。
@DeleteMapping : DELETE 请求。
前后端传值:
@RequestParam 以及 @Pathvairable :@PathVariable⽤于获取路径
参数,@RequestParam⽤于获取查询参数。
@RequestBody :⽤于读取 Request 请求(可能是
POST,PUT,DELETE,GET 请求)的 body 部分并且 Content-Type 为 appl
ication/json 格式的数据,接收到数据之后会⾃动将数据绑定到 Java 对
象上去。系统会使⽤ HttpMessageConverter 或者⾃定义的 HttpMessa
geConverter 将请求的 body 中的 json 字符串转换为 java 对象。
详细介绍可以查看这篇⽂章:《Spring/Spring Boot 常⽤注解总结》 。
我们可以通过 application.properties 或者 application.yml 对
Spring Boot 程序进⾏简单的配置。如果,你不进⾏配置的话,就是使⽤的默认
配置。
YAML 是⼀种⼈类可读的数据序列化语⾔。它通常⽤于配置⽂件。与属性⽂件相
⽐,如果我们想要在配置⽂件中添加复杂的属性,YAML ⽂件就更加结构化,⽽
且更少混淆。可以看出 YAML 具有分层配置数据。
相⽐于 Properties 配置的⽅式,YAML 配置的⽅式更加直观清晰,简介明了,有
层次感。
但是,YAML 配置的⽅式有⼀个缺点,那就是不⽀持 @PropertySource 注解
导⼊⾃定义的 YAML 配置。
我们要读取的配置⽂件 application.yml 内容如下:
使⽤ @Value("${property}") 读取⽐较简单的配置信息:
这个时候你就可以像使⽤普通 bean ⼀样,将其注⼊到类中使⽤:
控制台输出:
我们先将 application.yml 修改为如下内容,明显看出这不是⼀个正确的
email 格式:
具体使⽤:
因为我们的邮箱格式不正确,所以程序运⾏的时候就报错,根本运⾏不起来,保
证了数据类型的安全性:
我们把邮箱测试改为正确的之后再运⾏,控制台就能成功打印出读取到的信息:
使⽤:
Spring 读取配置⽂件也是有优先级的,直接上图:
更对内容请查看官⽅⽂档:https://docs.spring.io/spring-
boot/docs/current/reference/html/spring-boot-features.html#boot-
features-external-config
我们经常在代码中会对⼀个数据结构封装成DO、SDO、DTO、VO等,⽽这些
Bean中的⼤部分属性都是⼀样的,所以使⽤属性拷⻉类⼯具可以帮助我们节省⼤
量的 set 和 get 操作。
常⽤的 Bean 映射⼯具有:Spring BeanUtils、Apache BeanUtils、
MapStruct、ModelMapper、Dozer、Orika、JMapper 。
由于 Apache BeanUtils 、Dozer 、ModelMapper 性能太差,所以不建议使⽤。
MapStruct 性能更好⽽且使⽤起来⽐较灵活,是⼀个⽐较不错的选择。
我们可以使⽤ Spring Boot Actuator 来对 Spring Boot 项⽬进⾏简单的监控。
集成了这个模块之后,你的 Spring Boot 应⽤程序就⾃带了⼀些开箱即⽤的获取
程序运⾏时的内部状态信息的 API。
⽐如通过 GET ⽅法访问 /health 接⼝,你就可以获取应⽤程序的健康指标。
数据的校验的重要性就不⽤说了,即使在前端对数据进⾏校验的情况下,我们还
是要对传⼊后端的数据再进⾏⼀遍校验,避免⽤户绕过浏览器直接通过⼀些
HTTP ⼯具直接向后端请求⼀些违法数据。
Spring Boot 程序做请求参数校验的话只需要 spring-boot-starter-web 依
赖就够了,它的⼦依赖包含了我们所需要的东⻄。
JSR 提供的校验注解:
@Null 被注释的元素必须为 null
@NotNull 被注释的元素必须不为 null
@AssertTrue 被注释的元素必须为 true
@AssertFalse 被注释的元素必须为 false
@Min(value) 被注释的元素必须是⼀个数字,其值必须⼤于等于指定的
最⼩值
@Max(value) 被注释的元素必须是⼀个数字,其值必须⼩于等于指定的
最⼤值
@DecimalMin(value) 被注释的元素必须是⼀个数字,其值必须⼤于等于
指定的最⼩值
@DecimalMax(value) 被注释的元素必须是⼀个数字,其值必须⼩于等于
指定的最⼤值
@Size(max=, min=) 被注释的元素的⼤⼩必须在指定的范围内
@Digits (integer, fraction) 被注释的元素必须是⼀个数字,其值
必须在可接受的范围内
@Past 被注释的元素必须是⼀个过去的⽇期
@Future 被注释的元素必须是⼀个将来的⽇期
@Pattern(regex=,flag=) 被注释的元素必须符合指定的正则表达式
Hibernate Validator 提供的校验注解:
@NotBlank(message =) 验证字符串⾮ null,且⻓度必须⼤于 0
@Email 被注释的元素必须是电⼦邮箱地址
@Length(min=,max=) 被注释的字符串的⼤⼩必须在指定的范围内
@NotEmpty 被注释的字符串的必须⾮空
@Range(min=,max=,message=) 被注释的元素必须在合适的范围内
使⽤示例:
我们在需要验证的参数上加上了 @Valid 注解,如果验证失败,它将抛出 Meth
odArgumentNotValidException 。默认情况下,Spring 会将此异常转换为
HTTP Status 400(错误请求)。
⼀定⼀定不要忘记在类上加上 Validated 注解了,这个参数可以告诉 Spring 去校
验⽅法参数。
更多内容请参考我的原创: 如何在 Spring/Spring Boot 中做参数校验?你需要
了解的都在这⾥!
可以使⽤ @ControllerAdvice 和 @ExceptionHandler 处理全局异常。
更多内容请参考我的原创 :Spring Boot 异常处理在实际项⽬中的应⽤
我们使⽤ @Scheduled 注解就能很⽅便地创建⼀个定时任务。
单纯依靠 @Scheduled 注解 还不⾏,我们还需要在 SpringBoot 中我们只需要
在启动类上加上 @EnableScheduling 注解,这样才可以启动定时任务。 @En
ableScheduling 注解的作⽤是发现注解 @Scheduled 的任务并在后台执⾏
该任务。
剖析⾯试最常⻅问题之 Spring Boot
|