Spring Boot

Spring Boot 是什么?

Spring Boot 是 Spring 的子项目,正如其名字,提供 Spring 的引导( Boot )的功能。
通过 Spring Boot ,我们开发者可以快速配置 Spring 项目,引入各种 Spring MVC、Spring Transaction、Spring AOP、MyBatis 等等框架,而无需不断重复编写繁重的 Spring 配置,降低了 Spring 的使用成本。
Spring Boot 提供了各种 Starter 启动器,提供标准化的默认配置。

  • spring-boot-starter-web 启动器,可以快速配置 Spring MVC 。
  • mybatis-spring-boot-starter 启动器,可以快速配置 MyBatis 。

并且,Spring Boot 基本已经一统 Java 项目的开发,大量的开源项目都实现了其的 Starter 启动器。

  • incubator-dubbo-spring-boot-project 启动器,可以快速配置 Dubbo 。
  • rocketmq-spring-boot-starter 启动器,可以快速配置 RocketMQ 。

Spring Boot 提供了哪些核心功能?

  • 独立运行 Spring 项目
    • Spring Boot 可以以 jar 包形式独立运行,运行一个 Spring Boot 项目只需要通过 java -jar xx.jar 来运行。
  • 内嵌 Servlet 容器
    • Spring Boot 可以选择内嵌 Tomcat、Jetty 或者 Undertow,这样我们无须以 war 包形式部署项目。
  • 提供 Starter 简化 Maven 配置
    • Spring 提供了一系列的 starter pom 来简化 Maven 的依赖加载。例如,当你使用了 spring-boot-starter-web ,会自动加入如下依赖。
  • 自动配置 Spring Bean
    • Spring Boot 检测到特定类的存在,就会针对这个应用做一定的配置,进行自动配置 Bean ,这样会极大地减少我们要使用的配置。
    • 当然,Spring Boot 只考虑大多数的开发场景,并不是所有的场景,若在实际开发中我们需要配置Bean ,而 Spring Boot 没有提供支持,则可以自定义自动配置进行解决。
  • 准生产的应用监控
    • Spring Boot 提供基于 HTTP、JMX、SSH 对运行时的项目进行监控。
  • 无代码生成和 XML 配置
    • Spring Boot 没有引入任何形式的代码生成,它是使用的 Spring 4.0 的条件 @Condition 注解以实现根据条件进行配置。同时使用了 Maven /Gradle 的依赖传递解析机制来实现 Spring 应用里面的自动配置。

Spring Boot 有什么优缺点?

Spring Boot 的优点

  • 使【编码】变简单。
  • 使【配置】变简单。
  • 使【部署】变简单。
  • 使【监控】变简单。

Spring Boot 的缺点

  • 没有提供相应的【服务发现和注册】的配套功能。
  • 自身的 acturator 所提供的【监控功能】,也需要与现有的监控对接。
  • 没有配套的【安全管控】方案。
  • 对于 REST 的落地,还需要自行结合实际进行 URI 的规范化工作。
  • 过于自动化,隐藏了bean的创建,自定义bean有可能会冲突。出现报错时不好解决。

Spring Boot、Spring MVC 和 Spring 有什么区别?

Spring 的完整名字,应该是 Spring Framework 。它提供了多个模块,Spring IoC、Spring AOP、Spring MVC 等等。所以,Spring MVC 是 Spring Framework 众多模块中的一个。
而 Spring Boot 是构造在 Spring Framework 之上的 Boot 启动器,旨在更容易的配置一个 Spring 项目。

Spring Boot 中的 Starter 是什么?

依赖管理是任何复杂项目的关键部分。以手动的方式来实现依赖管理不太现实,你得花更多时间,同时你在项目的其他重要方面能付出的时间就会变得越少。
Spring Boot Starter 就是为了解决这个问题而诞生的。Starter POM 是一组方便的依赖描述符,您可以将其包含在应用程序中。您可以获得所需的所有 Spring 和相关技术的一站式服务,无需通过示例代码搜索和复制粘贴依赖。

Spring Boot 常用的 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 。

如何统一引入 Spring Boot 版本?

  • 方式一:继承 spring-boot-starter-parent 项目。
    1
    2
    3
    4
    5
    <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.1.RELEASE</version>
    </parent>
  • 方式二:导入 spring-boot-dependencies 项目依赖。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <dependencyManagement>
    <dependencies>
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-dependencies</artifactId>
    <version>1.5.1.RELEASE</version>
    <type>pom</type>
    <scope>import</scope>
    </dependency>
    </dependencies>
    </dependencyManagement>
    因为一般我们的项目中,都有项目自己的 Maven parent 项目,所以【方式一】显然会存在冲突。所以实际场景下,推荐使用【方式二】。

运行 Spring Boot 有哪几种方式?

  • 打包成 Fat Jar ,直接使用 java -jar 运行。目前主流的做法,推荐。
  • 在 IDEA 或 Eclipse 中,直接运行应用的 Spring Boot 启动类的 #main(String[] args) 启动。适用于开发调试场景。
  • 如果是 Web 项目,可以打包成 War 包,使用外部 Tomcat 或 Jetty 等容器。

如何打包 Spring Boot 项目?

通过引入 spring-boot-maven-plugin 插件,执行 mvn clean package 命令,将 Spring Boot 项目打成一个 Fat Jar 。后续,我们就可以直接使用 java -jar 运行。

如果更改内嵌 Tomcat 的端口?

  • 方式一,修改 application.properties 配置文件的 server.port 属性。
    1
    server.port=9090
  • 方式二,通过启动命令增加 server.port 参数进行修改。
    1
    java -jar xxx.jar --server.port=9090
    当然,以上的方式,不仅仅适用于 Tomcat ,也适用于 Jetty、Undertow 等服务器。

如何重新加载 Spring Boot 上的更改,而无需重新启动服务器?

  • 【推荐】spring-boot-devtools 插件。注意,这个工具需要配置 IDEA 的自动编译。
  • Spring Loaded 插件。Spring Boot 2.x已经不支Spring Loaded插件的更新了。可以无视。
  • JRebel 插件,需要付费。

Spring Boot 的配置文件有哪几种格式?

  • .properties
    • 支持@PropertySource
  • .ymal
    • 不支持@PropertySource

Spring Boot 默认配置文件是什么?

对于 Spring Boot 应用,默认的配置文件根目录下的 application 配置文件,当然可以是 Properties 格式,也可以是 YAML 格式。

Spring Boot 如何定义多套不同环境配置?

  • 方案一,生产环境的配置文件放在生产环境的服务器中,以 java -jar myproject.jar –spring.config.location=/xxx/yyy/application-prod.properties 命令,设置 参数 spring.config.location 指向配置文件。
  • 方案二,使用 Jenkins 在执行打包,配置上 Maven Profile 功能,使用服务器上的配置文件。😈 整体来说,和【方案一】的差异是,将配置文件打包进了 Jar 包中。
  • 方案三,使用配置中心。

Spring Boot 配置加载顺序?

  • spring-boot-devtools 依赖的 spring-boot-devtools.properties 配置文件。
  • 单元测试上的 @TestPropertySource 和 @SpringBootTest 注解指定的参数。
  • 命令行指定的参数。例如 java -jar springboot.jar –server.port=9090 。
  • 命令行中的 spring.application.json 指定参数。例如 java -Dspring.application.json=’{“name”:”Java”}’ -jar springboot.jar 。
  • ServletConfig 初始化参数。
  • ServletContext 初始化参数。
  • JNDI 参数。例如 java:comp/env 。
  • Java 系统变量,即 System#getProperties() 方法对应的。
  • 操作系统环境变量。
  • RandomValuePropertySource 配置的 random.* 属性对应的值。
  • Jar 外部的带指定 profile 的 application 配置文件。例如 application-{profile}.yaml 。
  • Jar 内部的带指定 profile 的 application 配置文件。例如 application-{profile}.yaml 。
  • Jar 外部 application 配置文件。例如 application.yaml 。
  • Jar 内部 application 配置文件。例如 application.yaml 。
  • 在自定义的 @Configuration 类中定于的 @PropertySource 。
  • 启动的 main 方法中,定义的默认配置。即通过 SpringApplication#setDefaultProperties(Map<String, Object> defaultProperties) 方法进行设置。

Spring Boot 有哪些配置方式?

  • .properties,.ymal 配置文件。
  • 注解配置。
  • Java Config 配置。

Spring Boot 的核心注解是哪个?

  • @SpringBootApplication 注解,就是 Spring Boot 的核心注解。
    • @Configuration 注解,指定类是 Bean 定义的配置类。
    • @ComponentScan 注解,扫描指定包下的 Bean 们。
    • @EnableAutoConfiguration 注解,打开自动配置的功能。如果我们想要关闭某个类的自动配置,可以设置注解的 exclude 或 excludeName 属性。

什么是 Spring Boot 自动配置?

@EnableAutoConfiguration 注解

Spring Boot 有哪几种读取配置的方式?

  • @Value 注解,读取配置到属性。最最最常用
  • @ConfigurationProperties 注解,读取配置到类上。

使用 Spring Boot 后,项目结构是怎么样的呢?

  • 方式一,controller、service、dao 三个包,每个包下面添加相应的 XXXController、YYYService、ZZZDAO 。
  • 方式二,按照业务模块分包,每个包里面放 Controller、Service、DAO 类。例如,业务模块分成 user、order、item 等等包,在 user 包里放 UserController、UserService、UserDAO 类。

如何在 Spring Boot 启动的时候运行一些特殊的代码?

  • 如果需要在 SpringApplication 启动后执行一些特殊的代码,你可以实现 ApplicationRunner 或 CommandLineRunner 接口,这两个接口工作方式相同,都只提供单一的 run 方法,该方法仅在 SpringApplication#run(…) 方法完成之前调用。

Spring Boot 2.X 有什么新特性?

  • 起步 JDK 8 和支持 JDK 9
  • 第三方库的升级
  • Reactive Spring
  • HTTP/2 支持
  • 配置属性的绑定
  • Gradle 插件
  • Actuator 改进
  • 数据支持的改进
  • Web 的改进
  • 支持 Quartz 自动配置
  • 测试的改进
  • 其它…

整合

如何将内嵌服务器换成 Jetty ?

默认情况下,spring-boot-starter-web 模块使用 Tomcat 作为内嵌的服务器。所以需要去除对 spring-boot-starter-tomcat 模块的引用,添加 spring-boot-starter-jetty 模块的引用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion> <!-- 去除 Tomcat -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency> <!-- 引入 Jetty -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</artifactId>
</dependency>

Spring Boot 中的监视器 Actuator 是什么?

spring-boot-actuator 提供 Spring Boot 的监视器功能,可帮助我们访问生产环境中正在运行的应用程序的当前状态。

安全性

Spring Boot 2.X 默认情况下,spring-boot-actuator 产生的 Endpoint 是没有安全保护的,但是 Actuator 可能暴露敏感信息。
所以一般的做法是,引入 spring-boot-start-security 依赖,使用 Spring Security 对它们进行安全保护。

如何集成 Spring Boot 和 Spring MVC ?

  • 引入 spring-boot-starter-web 的依赖。
  • 实现 WebMvcConfigurer 接口,可添加自定义的 Spring MVC 配置。

在使用 Spring MVC 时,我们一般会做如下几件事情

  • 实现自己项目需要的拦截器,并在 WebMvcConfigurer 实现类中配置。
  • 配置 @ControllerAdvice + @ExceptionHandler 注解,实现全局异常处理。
  • 配置 @ControllerAdvice ,实现 ResponseBodyAdvice 接口,实现全局统一返回。

如何集成 Spring Boot 和 Spring Security ?

  • Spring Security
  • Apache Shiro

相对来说,Spring Security 现在会比 Apache Shiro 更流行。

  • 引入 spring-boot-starter-security 的依赖。
  • 继承 WebSecurityConfigurerAdapter ,添加自定义的安全配置。

如何集成 Spring Boot 和 Spring Security OAuth2 ?

如何集成 Spring Boot 和 JPA ?

  • 引入 spring-boot-starter-data-jpa 的依赖。
  • 在 application 配置文件中,加入 JPA 相关的少量配置。当然,数据库的配置也要添加进去。
  • 具体编码。

Spring Boot 2 默认使用的数据库连接池是 HikariCP ,目前最好的性能的数据库连接池的实现。
spring-boot-starter-data-jpa 的依赖,使用的默认 JPA 实现是 Hibernate 5.X 。

如何集成 Spring Boot 和 MyBatis ?

  • 引入 mybatis-spring-boot-starter 的依赖。
  • 在 application 配置文件中,加入 MyBatis 相关的少量配置。当然,数据库的配置也要添加进去。
  • 具体编码。

如何集成 Spring Boot 和 RabbitMQ ?

  • 引入 spring-boot-starter-amqp 的依赖
  • 在 application 配置文件中,加入 RabbitMQ 相关的少量配置。
  • 具体编码。

如何集成 Spring Boot 和 Kafka ?

  • 引入 spring-kafka 的依赖。
  • 在 application 配置文件中,加入 Kafka 相关的少量配置。
  • 具体编码。

如何集成 Spring Boot 和 RocketMQ ?

  • 引入 rocketmq-spring-boot 的依赖。
  • 在 application 配置文件中,加入 RocketMQ 相关的少量配置。
  • 具体编码。

Spring Boot 支持哪些日志框架?

  • Logback
  • Log4j2
  • Log4j
  • Java Util Logging