1.什么是 SpringBoot
我们在使用 Spring 的时候,往往需要进行大量的配置,这占用了我们很多的时间和精力。例如:
-
开启 SpringMVC、事务管理时,需要进行显示配置
-
集成 Mybatis 等第三方技术时也需要进行显示配置
Spring Boot 是一个用于快速开发应用程序的开源 Java 框架,主要目的是通过减少配置来简化 Spring 的开发。
2.Spring Boot 的主要优点
-
简化配置:SpringBoot 采用约定大于配置的方式,很多地方采用了默认配置,开发人员不必手动进行繁琐的配置。
-
内置服务器:Spring Boot 内置了 Web 服务器,如 Tomcat 和 Jetty,避免了手动安装和配置服务器的麻烦。
-
微服务:Spring Boot 提供了自动配置等功能,并内嵌了web服务器、特别适合于微服务架构的开发。
-
社区活跃:Spring Boot 拥有庞大的用户群体和开发者社区,开发人员遇到问题时可以从社区获得帮助。
3.什么是 Spring Boot Starter?
Spring Boot Starter 是一系列依赖的集合,通过 Spring Boot Starter 可以简化依赖的管理。常见的Starter如下:
-
spring-boot-starter-web:提供 Spring MVC + 内嵌的 Tomcat 。
-
spring-boot-starter-data-jpa:提供 Spring JPA + Hibernate 。
-
spring-boot-starter-data-Redis:提供 Redis 。
-
mybatis-spring-boot-starter:提供 MyBatis 。
4.Spring Boot 支持哪些内嵌 Servlet 容器?
Spring Boot 使用 Tomcat 作为默认的 Web 服务器,如果想使用 Jetty,直接在 pom.xml 文件中排除 Tomcat 依赖,添加 Jetty 依赖即可。
<!--从Web启动器依赖中排除Tomcat-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--添加Jetty依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</artifactId>
</dependency>
5.Spring Boot 打成的 jar 包和普通的 jar 包有什么区别 ?
-
Spring Boot 项目最终打包成的 jar 是可执行 jar ,这种 jar 可以直接通过 java -jar xxx.jar 命令来运行。
-
Spring Boot 的 jar 包无法被其它项目依赖。
Spring Boot 的 jar 包和普通的 jar 包结构不同。普通的 jar 包,解压后直接就是包名,包里就是我们的代码,而 Spring Boot 的 jar 包解压后,在 \BOOT-INF\classes 目录下才是代码,因此无法被直接引用。如果非要引用,可以在 pom.xml 文件中进行配置,将 Spring Boot 项目打包成两个 jar ,一个可执行,一个可引用。
6.介绍一下 @SpringBootApplication 注解
@SpringBootApplication 可以看作是 @Configuration、@EnableAutoConfiguration、@ComponentScan 等注解的集合。其中:
-
@Configuration:用来将一个类标识为配置类。
-
@EnableAutoConfiguration:用来启用 SpringBoot 的自动配置
-
@ComponentScan:用来扫描被 @Component 等注解标注的类,创建这些类的对象加入到IOC容器中,注解默认会扫描该启动类所在包下的所有类。
7.Spring Boot 的自动配置是如何实现的?
SpringBoot 的自动配置是通过 @EnableAutoConfiguration 注解来实现的
-
Spring Boot 在启动时,会扫描 classpath 下的 META-INF/spring.factories 文件,从文件中读取需要自动装配的所有配置类。
-
Spring Boot 会根据配置类的条件注解判断当前配置类是否满足自动装配的条件,判断的条件可以是当前项目中是否存在某些类或者某些配置,条件不满足的配置类会被过滤掉,留下来的配置类会生成相应的对象放到 Ioc 容器中。
-
自动配置类可以通过@ConfigurationProperties注解来绑定配置文件中的属性,如果配置文件中不存在,会采用默认配置。
8.如何自定义一个 starter
自定义一个starter可以按照如下步骤进行
-
第一步:自定义一个Maven项目,并引入相关依赖。下面这二个依赖是必须的:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
</dependency>
-
第二步:在项目中创建自动配置类,并使用@Configuration注解进行标注,也可以在配置类上添加条件注解来进行按需加载,在配置类当中使用@Bean注解来标注需要自动装配的bean。
-
第三步:在资源路径的META/INF目录下创建spring.factories文件,并在文件中填写自动配置类。
-
第四步:创建一个属性配置类,并用@ConfigurationProperties注解进行标注。
-
第五步:将项目打包到本地仓库,在其它项目中引入 starter,springboot 就会进行自动装配。
自动配置类中可以使用@AutoConfigurationProperties或@Import引入属性配置类
@ConfigurationProperties注解中可以指定prefix属性,用来从配置文件中加载指定数据
9.Spring Boot 常用配置文件及其优先级
Spring Boot 的配置文件有 application.yml、application.properties。最常用的是 application.yml。
不同类型的优先级:
application.properties > application.yml > application.yaml
不同位置处的优先级:
10.Spring Boot 读取配置文件的方式有哪些?
常用的方法有三种:
-
先将读取配置文件的类注册为一个bean,然后通过 @Value 读取比较简单的配置信息。
-
在类中注入IOC容器中的 Environment 对象读取配置文件, Environment 对象中封装了配置文件的所有数据,需要使用哪个数据只需要通过调用 Environment 对象的 getProperty(String name) 方法获取。
-
先将读取配置文件的类注册为一个bean,然后在类上添加 @ConfigurationProperties 注解,在该注解中可以使用 prefix 属性加载指定前缀的数据。
Note:当存在多个YAML配置文件时,@ConfigurationProperties 注解默认读取的是 application.yml,如果想读取其他配置文件,可以在@PropertySource注解中指定相应的文件路径。
@Configuration @PropertySource("classpath:custom.properties") @ConfigurationProperties(prefix = "custom") public class CustomConfig { private String property1; private String property2; // getters and setters }
11.Spring Boot 如何监控系统实际运行状况?
我们可以使用 Spring Boot Actuator 来对 Spring Boot 项目进行简单的监控。
集成了这个模块之后,你的 Spring Boot 应用程序就自带了一些开箱即用的获取程序运行时的内部状态信息的 API。通过 GET 方法访问 /health 接口,就可以获取应用程序的健康指标。
12.Spring Boot 如何做请求参数校验?
-
导入 JSR 和 Hibernate Validator 的坐标
-
如果要校验 @RequestBody 注解修饰的方法参数,首先在实体类的属性上添加校验规则,然后在方法参数前面加上@Valid 注解;如果要校验 @RequestParam 和 @PathVariable 注解修饰的方法参数,首先在 Controller 类上添加 @Validated 注解告诉 Spring 校验方法参数,然后在方法参数前面加上 @Valid 注解和校验规则的注解。
13.如何使用 Spring Boot 实现全局异常处理?
可以使用 @ControllerAdvice 和 @ExceptionHandler 实现全局异常处理,通过这二个注解可以为所有的Controller或者部分Controller织入异常处理的逻辑,当Controller中的方法抛出异常的时候,会由@ExceptionHandler注解中的异常类型进行匹配,如果匹配成功,则让注解修饰的方法对异常进行处理。
14.Spring Boot 中如何实现定时任务?
-
首先在 SpringBoot 的启动类上添加 @EnableScheduling 注解
-
然后在需要开启定时任务的方法上面添加 @Scheduled 注解创建定时任务,在这个注解当中有一个属性,用来指定方法每隔多长时间执行一次。
@EnableScheduling 注解的作用是发现注解 @Scheduled 的任务并在后台执行该任务。