1、什么是Spring Boot?

**Spring Boot 是基于Spring的一套快速开发整合包,简化了Spring众多框架中所需的大量且繁琐的配置文件;

  1. Spring框架这个大家族中,产生了很多衍生框架,比如 SpringSpringMvc框架等,Spring的核心内容在于控制反转(IOC)和依赖注入(DI),所谓控制反转并非是一种技术,而是一种思想,在操作方面是指在spring配置文件中创建<bean>,依赖注入即为由spring容器为应用程序的某个对象提供资源,比如 引用对象、常量数据等。<br /> SpringBoot是一个框架,一种全新的编程规范,他的产生简化了框架的使用,所谓简化是指简化了Spring众多框架中所需的大量且繁琐的配置文件,所以 SpringBoot是一个服务于框架的框架,服务范围是简化配置文件。

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

<br />三者专注的领域不同,解决的问题也不一样;总的来说,<br />Spring 就像一个大家族,有众多衍生产品例如 Boot,Security,JPA等等。但他们的基础都是Spring 的 IOC 和 AOP,IOC提供了依赖注入的容器,而AOP解决了面向切面的编程,然后在此两者的基础上实现了其他衍生产品的高级功能;<br />Spring MVC是基于 Servlet 的一个 MVC 框架,主要解决 WEB 开发的问题,因为 Spring 的配置非常复杂,各种xml,properties处理起来比较繁琐。于是为了简化开发者的使用,Spring社区创造性地推出了Spring Boot,它遵循约定优于配置,极大降低了Spring使用门槛,但又不失Spring原本灵活强大的功能,下面用一张图来描述三者的关系:<br />

image.png
最后一句话总结:
Spring MVC和Spring Boot都属于Spring,
Spring MVC 是基于Spring的一个 MVC 框架,
Spring Boot 是基于Spring的一套快速开发整合包

3.Spring Boot 的核心配置文件有哪几个?它们的区别是什么?

Spring Boot 的都知道在 Spring Boot 中有以下两种配置文件

  • bootstrap (.yml 或者 .properties)
  • application (.yml 或者 .properties)

    Spring Cloud 构建于 Spring Boot 之上,在 Spring Boot 中有两种上下文,一种是 bootstrap, 另外一种是 application, bootstrap 是应用程序的父上下文,也就是说 bootstrap 加载优先于 applicaton。bootstrap 主要用于从额外的资源来加载配置信息,还可以在本地外部配置文件中解密属性。这两个上下文共用一个环境,它是任何Spring应用程序的外部属性的来源。bootstrap 里面的属性会优先加载,它们默认也不能被本地相同配置覆盖。

因此,对比 application 配置文件,bootstrap 配置文件具有以下几个特性。

  • boostrap 由父 ApplicationContext 加载,比 applicaton 优先加载
  • boostrap 里面的属性不能被覆盖

bootstrap/ application 的应用场景
application 配置文件这个容易理解,主要用于 Spring Boot 项目的自动化配置。
bootstrap 配置文件有以下几个应用场景。

  • 使用 Spring Cloud Config 配置中心时,这时需要在 bootstrap 配置文件中添加连接到配置中心的配置属性来加载外部配置中心的配置信息;
  • 一些固定的不能被覆盖的属性
  • 一些加密/解密的场景;

    4、SpringBoot可以做什么?

    最明显的特点是,让文件配置变的相当简单、让应用部署变的简单(SpringBoot内置服务器,并装备启动类代码),可以快速开启一个Web容器进行开发。**
    

    5、SpringBoot工程的使用特点?

    (1)一个简单的SpringBoot工程是不需要在pom.xml手动添加什么配置的,如果与其他技术合用 比如postMan(文档在线自动生成、开发功能测试的一套工具)、Swagger(文档在线自动生成、开发功能测试的一套工具),则需要在pom.xml中添加依赖,由程序自动加载依赖jar包等配置文件。
    (2)我们之前在利用SSM或者SSH开发的时候,在resources中储存各种对应框架的配置文件,而现在我们只需要一个配置文件即可,配置内容也大体有 服务器端口号、数据库连接的地址、用户名、密码。这样,虽然简单 但在一定问题上而言,这也是极不安全的,将所有配置,放在一个文件里,是很危险的,但对于一般项目而言并不会有太大影响。
    (3)在SpringBoot创建时会自动创建Bootdemo1Application启动类,代表着本工程项目和服务器的启动加载,在springBoot中是内含服务器的,所以不需手动配置Tomact,但注意端口号冲突问题。

    6、Spring Boot 的核心注解是哪个?它主要由哪几个注解组成的?

    启动类上面的注解是@SpringBootApplication,它也是 Spring Boot 的核心注解,主要组合包含了以下 3 个注解:
    @SpringBootConfiguration:组合了 @Configuration 注解,实现配置文件的功能。
    @EnableAutoConfiguration:打开自动配置的功能,也可以关闭某个自动配置的选项,如关闭数据源自动配置 功能:@SpringBootApplication(exclude= { DataSourceAutoConfiguration.class })。
    @ComponentScan:Spring组件扫描。**

    7、开启 Spring Boot 特性有哪几种方式?

    1)继承spring-boot-starter-parent项目
    2)导入spring-boot-dependencies项目依赖

8、如何使用 Spring Boot 部署到不同的服务器?

你需要做下面两个步骤:

  • 在一个项目中生成一个 war 文件。
  • 将它部署到你最喜欢的服务器(websphere 或者 Weblogic 或者 Tomcat and so on)。

    9、Spring Boot 需要独立的容器运行吗?

  • 可以不需要,内置了 Tomcat/ Jetty 等容器。

10、你如何理解 Spring Boot 中的 Starters?Starters是什么?

Starters可以理解为启动器,它包含了一系列可以集成到应用里面的依赖包,你可以一站式集成Spring及其他技术,而不需要到处找示例代码和依赖包。如你想使用Spring JPA访问数据库,只要加入spring-boot-starter-data-jpa启动器依赖就能使用了。<br />    Starters包含了许多项目中需要用到的依赖,它们能快速持续的运行,都是一系列得到支持的管理传递性依赖。<br />    Starters命名<br />    Spring Boot官方的启动器都是以spring-boot-starter-命名的,代表了一个特定的应用类型。<br />第三方的启动器不能以spring-boot开头命名,它们都被Spring Boot官方保留。一般一个第三方的应该这样命名,像mybatis的mybatis-spring-boot-starter。

Starters分类

1. Spring Boot应用类启动器

启动器名称 功能描述
spring-boot-starter 包含自动配置、日志、YAML的支持。
spring-boot-starter-web 使用Spring MVC构建web 工程,包含restful,默认使用Tomcat容器。

2. Spring Boot生产启动器

启动器名称 功能描述
spring-boot-starter-actuator 提供生产环境特性,能监控管理应用。

3. Spring Boot技术类启动器

启动器名称 功能描述
spring-boot-starter-json 提供对JSON的读写支持。
spring-boot-starter-logging 默认的日志启动器,默认使用Logback。

**

11、SpringBoot 实现热部署有哪几种方式?

Spring boot实现热部署的两种方式,<br />    这两种方法分别是使用 Spring Loaded;<br />    使用spring-boot-devtools进行热部署。

12、Spring Boot 配置加载顺序?

在 Spring Boot 里面,可以使用以下几种方式来加载配置。本章内容基于 Spring Boot 2.0 进行详解。<br />    1、properties文件;<br />    2、YAML文件;<br />    3、系统环境变量;<br />    4、命令行参数;<br />    等等……<br />    我们可以在 Spring Beans 里面直接使用这些配置文件中加载的值,如:<br />    1、使用 @Value 注解直接注入对应的值,这能获取到 Spring 中 Environment 的值;<br />    2、使用 @ConfigurationProperties 注解把对应的值绑定到一个对象;<br />    3、直接获取注入 Environment 进行获取;<br />    配置属性的方式很多,Spring boot使用了一种独有的 PropertySource 可以很方便的覆盖属性的值。<br />    配置属性加载的顺序如下:<br />    1、开发者工具 `Devtools` 全局配置参数;<br />    2、单元测试上的 `@TestPropertySource` 注解指定的参数;<br />    3、单元测试上的 `@SpringBootTest` 注解指定的参数;<br />    4、命令行指定的参数,如 `java -jar springboot.jar --name="Java技术栈"`;<br />    5、命令行中的 `SPRING_APPLICATION_JSONJSON` 指定参数, 如 `java -Dspring.application.json='{"name":"Java技术栈"}' -jar springboot.jar`<br />    6、`ServletConfig` 初始化参数;<br />    7、`ServletContext` 初始化参数;<br />    8、JNDI参数(如 `java:comp/env/spring.application.json`);<br />    9、Java系统参数(来源:`System.getProperties()`);<br />    10、操作系统环境变量参数;<br />   11、`RandomValuePropertySource` 随机数,仅匹配:`ramdom.*`;<br /> 12、JAR包外面的配置文件参数(`application-{profile}.properties(YAML)`)<br /> 13、JAR包里面的配置文件参数(`application-{profile}.properties(YAML)`)<br />    14、JAR包外面的配置文件参数(`application.properties(YAML)`)<br />    15、JAR包里面的配置文件参数(`application.properties(YAML)`)<br />     16、`@Configuration`配置文件上 `@PropertySource` 注解加载的参数;<br />     17、默认参数(通过 `SpringApplication.setDefaultProperties` 指定);<br />      数字小的优先级越高,即数字小的会覆盖数字大的参数值,

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

    我们在开发Spring Boot应用时,通常同一套程序会被应用和安装到几个不同的环境,比如:开发、测试、生产等。其中每个环境的数据库地址、服务器端口等等配置都会不同,如果在为不同环境打包时都要频繁修改配置文件的话,那必将是个非常繁琐且容易发生错误的事。<br />      对于多环境的配置,各种项目构建工具或是框架的基本思路是一致的,通过配置多份不同环境的配置文件,再通过打包命令指定需要打包的内容之后进行区分打包,Spring Boot也不例外,或者说更加简单。

springboot多环境配置

在Spring Boot中多环境配置文件名需要满足application-{profile}.properties的格式,其中{profile}对应你的环境标识,比如:<br />       application-dev.properties:开发环境<br />       application-test.properties:测试环境<br />       application-prod.properties:生产环境<br />     至于哪个具体的配置文件会被加载,需要在application.properties文件中通过spring.profiles.active属性来设置,其值对应{profile}值。<br />    如:spring.profiles.active=test就会加载application-test.properties配置文件内容

14、Spring Boot 可以兼容老 Spring 项目吗,如何做?

    可以兼容,使用 @ImportResource 注解导入老 Spring 项目配置文件。

15、spring boot 2.1 新特性介绍

1.基于 Java 8,支持 Java 9,这意味着不可以使用JDK7 或更旧的版本运行SpringBoot2.<br />    2.支持 Quartz 调度程序<br />    3.大大简化了安全自动配置<br />    4.支持嵌入式 Netty<br />    5.Tomcat, Undertow 和 Jetty 均已支持 HTTP/2<br />    6.全新的执行器架构,支持 Spring MVC, WebFlux 和 Jersey<br />    7.使用 Spring WebFlux/WebFlux.fn 提供响应式 Web 编程支持<br />    8.为各种组件的响应式编程提供了自动化配置,如:Reactive Spring Data、Reactive Spring Security 等<br />    9.用于响应式 Spring Data Cassandra, MongoDB, Couchbase 和 Redis 的自动化配置和启动器 POM<br />    10.引入对 Kotlin 1.2.x 的支持,并提供了一个 runApplication 函数,让你通过惯用的 Kotlin 来运行 Spring Boot 应用程序。更多信息请参阅参考文档中对 Kotlin 的支持部分<br />    11.启动时的 ASCII 图像 Spring Boot banner 现已支持 GIF

16、RequestMapping 和 GetMapping 的不同之处在哪里?

  • RequestMapping 具有类属性的,可以进行 GET,POST,PUT

或者其它的注释中具有的请求方法。

  • GetMapping 是 GET 请求方法中的一个特例。

它只是 ResquestMapping 的一个延伸,目的是为了提高清晰度。

17、JPA 和 Hibernate 有哪些区别?

简而言之

  • JPA 是一个规范或者接口
  • Hibernate 是 JPA 的一个实现

    当我们使用 JPA 的时候,我们使用 javax.persistence 包中的注释和接口时,不需要使用 hibernate 的导入包。
    我们建议使用 JPA 注释,因为哦我们没有将其绑定到 Hibernate 作为实现。后来(我知道 - 小于百分之一的几率),我们可以使用另一种 JPA 实现。

18、如何不通过任何配置来选择 Hibernate 作为 JPA 的默认实现?

因为 Spring Boot 是自动配置的。<br />    下面是我们添加的依赖项<br />    <dependency><br />           <groupId>org.springframework.boot</groupId><br />           <artifactId>spring-boot-starter-data-jpa</artifactId><br />      </dependency><br />    spring-boot-stater-data-jpa 对于 Hibernate 和 JPA 有过渡依赖性。<br />当 Spring Boot 在类路径中检测到 Hibernate 中,将会自动配置它为默认的 JPA 实现。

19、我们如何连接一个像 MySQL 或者 orcale 一样的外部数据库?

让我们以 MySQL 为例来思考这个问题:

第一步 - 把 mysql 连接器的依赖项添加至 pom.xml


mysql
mysql-connector-java

第二步 - 从 pom.xml 中移除 H2 的依赖项

或者至少把它作为测试的范围。

第三步 - 安装你的 MySQL 数据库

第四步 - 配置你的 MySQL 数据库连接

配置 application.properties
spring.jpa.hibernate.ddl-auto=none
spring.datasource.url=jdbc:mysql://localhost:3306/todo_example
spring.datasource.username=todouser
spring.datasource.password=YOUR_PASSWORD

第五步 - 重新启动,你就准备好了!
就是这么简单!

20、发布 Spring Boot 用户应用程序自定义配置的最好方法是什么?

@Value 的问题在于,您可以通过应用程序分配你配置值。更好的操作是采取集中的方法。<br />    你可以使用 @ConfigurationProperties 定义一个配置组件。
@Component
@ConfigurationProperties("basic")
public class BasicConfiguration {
    private boolean value;
    private String message;
    private int number;
你可以在 application.properties 中配置参数。
basic.value: true
basic.message: Dynamic Message
basic.number: 100

21、 配置文件的需求是什么?

企业应用程序的开发是复杂的,你需要混合的环境:
  • Dev
  • QA
  • Stage
  • Production

    在每个环境中,你想要不同的应用程序配置。

    配置文件有助于在不同的环境中进行不同的应用程序配置。

    Spring 和 Spring Boot 提供了你可以制定的功能。

  • 不同配置文件中,不同环境的配置是什么?

  • 为一个制定的环境设置活动的配置文件。

    Spring Boot 将会根据特定环境中设置的活动配置文件来选择应用程序的配置。

    22、如何使用配置文件通过 Spring Boot 配置特定环境的配置?

    配置文件不是设别环境的关键。
    在下面的例子中,我们将会用到两个配置文件

  • dev

  • prod

    缺省的应用程序配置在 application.properties 中。让我们来看下面的例子:
    application.properties
    basic.value= true
    basic.message= Dynamic Message
    basic.number= 100
    我们想要为 dev 文件自定义 application.properties 属性。我们需要创建一个名为 application-dev.properties 的文件,并且重写我们想要自定义的属性。
    application-dev.properties
    basic.message: Dynamic Message in DEV
    一旦你特定配置了配置文件,你需要在环境中设定一个活动的配置文件。
    有多种方法可以做到这一点:

  • 在 VM 参数中使用 Dspring.profiles.active=prod

  • 在 application.properties 中使用 spring.profiles.active=prod