1.1. 【1】什么是SpringBoot?

​ Spring Boot是 Spring 的子项目,他的核心思想是自动装配,通过 Spring Boot开发者可以快速配置 Spring 项目,引入各种 Spring MVC、Spring Transaction、Spring AOP、MyBatis 等等框架,而无需不断重复编写繁重的 Spring 配置,降低了 Spring 的使用成本。Spring Boot 核心模块及各种 Starter 启动器例如:

核心模块 模块说明
Spring-boot 核心加载
Spring-boot-test 支持Springboot的单元测试
Spring-boot-actuator 监控健康管理应用
Spring-boot-loader 允许你构建可用java –jar直接运行的jar包
Spring-boot-autoconfigure 自动配置尝试推测用户可能需要的bean
Spring-boot-starter-security security权限系统的支持
Spring-boot-starter-amqp 对AMQP消息队列的支持
Spring-boot-starter-web web项目的支持
Spring-boot-starter-aop aop的支持
Spring-boot-starter-jdbc jdbc的支持

1.2. 【2】SpringBoot提供了哪些核心功能?

  • 可独立运行的Spring项目:Spring Boot可以以jar包的形式独立运行。
  • 内嵌的Servlet容器:Spring Boot可以选择内嵌Tomcat、Jetty或者Undertow,无须以war包形式部署项目。

  • 简化的Maven配置:Spring提供推荐的基础 POM 文件来简化Maven 配置。

  • 自动配置Spring:Spring Boot会根据项目依赖来自动配置Spring 框架,极大地减少项目要使用的配置。

  • 提供生产就绪型功能:提供可以直接在生产环境中使用的功能,如性能指标、应用信息和应用健康检查。

  • 无代码生成和xml配置:Spring Boot不生成代码。完全不需要任何xml配置即可实现Spring的所有配置。

1.3. 【3】SpringBoot、Springmvc和Spring的区别

  • Spring :完整名字 Spring Framework 。它提供了多个模块,Spring IOC、Spring AOP、Spring MVC 等
  • Springmvc:Spring的子项目,主要是controller层的处理,核心有处理器适配器,处理器映射器,视图解析器等
  • Springboot :Spring 的子项目,他的核心思想是自动装配,通过 Spring Boot开发者可以快速配置 Spring 项目,引入各种 Spring MVC、Spring Transaction、Spring AOP、MyBatis 等等框架,而无需不断重复编写繁重的 Spring 配置,降低了 Spring 的使用成本

1.4. 【4】如何统一引入SpringBoot版本?

​ 方式一:继承 spring-boot-starter-parent 项目。配置代码如下:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.17.RELEASE</version>
    <relativePath/> 
</parent>

​ 方式二:导入 spring-boot-dependencies 项目依赖。配置代码如下:

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>2.1.17.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

​ 因为一般我们的项目中,都有项目自己的 Maven parent 项目,所以【方式一】显然会存在冲突。所以实际场景下,推荐使用【方式二】。

1.5. 【5】如何打包 SpringBoot 项目?

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

1.6. 【6】SpringBoot如何热加载项目?

通过引入 spring-boot-devtools 模块。注意,这个工具需要配置 IDEA 的自动编译。

<!--热部署配置-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
</dependency>

1.7. 【7】SpringBoot的配置文件加载优先级

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

可能有同学说,我在网上看到面试题中,说还有一个根目录下的 bootstrap 配置文件。这个是 Spring Cloud 新增的启动配置文件,需要引入 spring-cloud-context 依赖后,才会进行加载,特点和用途主要是:

  • 【特点】因为 bootstrap 由父 ApplicationContext 加载,比 application 优先加载。
  • 【特点】因为 bootstrap 优先于 application 加载,所以不会被它覆盖。
  • 【用途】使用配置中心 Spring Cloud Config 时,需要在 bootstrap 中配置配置中心的地址,从而实现父 ApplicationContext 加载时,从配置中心拉取相应的配置到应用中。

1.8. 【8】SpringBoot的profile是什么?如何配置?

profile是用来完成不同环境下,配置动态切换功能的。

profile配置方式:

​ 多profile文件方式:

​ application-dev.properties/yml 开发环境

​ application-test.properties/yml 测试环境

​ application-pro.properties/yml 生产环境

​ yml多文档方式:

​ 在yml中使用 --- 分隔不同配置

profile激活方式:

  • 配置文件: 再配置文件中配置:spring.profiles.active=dev
  • 虚拟机参数:在VM options 指定:-Dspring.profiles.active=dev
  • 命令行参数:java -jar XXX.jar --spring.profiles.active=dev

1.9. 【9】Spring Boot 有哪几种读取配置的方式?

Spring Boot 目前支持 3 种读取配置:

  • Environment:environment.getProperty("server.port")获得application.yml中的端口
  • @Value:支持和 @PropertySource 注解一起使用,指定使用的配置文件
  • @ConfigurationProperties:@ConfigurationProperties(prefix = "config-properties"),配合@EnableConfigurationProperties(value = ConfigInfo.class),开启自动配置,装配ConfigInfo的实例化对象,并且交予spring进行管理,在下面直接使用@Autowired注入configInfo对象

1.10. 【10】SpringBoot2.X 有什么新特性?

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

1.11. 【11】SpringBoot自动装配流程

SpringBoot为我们提供了各种框架的默认配置,而默认配置生效的步骤如下:

​ 1、系统启动加载@SpringBootApplication然后加载@EnableAutoConfiguration

​ 2、@EnableAutoConfiguration是开启核心配置的注解,注解上@Import({AutoConfigurationImportSelector.class})

​ 3、AutoConfigurationImportSelector中getCandidateConfigurations(annotationMetadata, attributes)加载所有配置

​ 4、getCandidateConfigurations中使用loadSpringFactories

​ 5、loadSpringFactories会去META-INF/spring.factories中已配置好的信息

因此,使用SpringBoot自动配置的关键有两点:

1)启动器starter

要想自动配置生效,只需要引入依赖即可,而依赖版本我们也不用操心,因为只要引入了SpringBoot提供的stater(启动器),就会自动管理依赖及版本了。

因此,玩SpringBoot的第一件事情,就是找starter,SpringBoot提供了大量的默认starter

2)全局配置yml文件

另外,SpringBoot的默认配置,都会读取默认属性,而这些属性可以通过自定义application.yml文件来进行覆盖。这样虽然使用的还是默认配置,但是配置中的值改成了我们自定义的。

因此,玩SpringBoot的第二件事情,就是通过application.yaml来覆盖默认属性值,形成自定义配置。

1.12. 【12】SpringBoot启动流程

SpringBoot项目启动第一步就是创建SpringApplication的实例,并且调用SpringApplication.run()这个方法。

创建SpringApplication实例主要完成三件事情:

  • 记录当前启动类字节码
  • 判断当前项目类型,普通Servlet、响应式WebFlux、NONE
  • 加载/META-INF/spring.factories文件,初始化ApplicationContextInitializer和ApplicationListener实例

而后的run()方法则会创建spring容器,流程如下:

  • 准备监听器,监听Spring启动的各个过程

  • 创建并配置环境参数Environment

  • 创建ApplicationContext

  • prepareContext():初始化ApplicationContext,准备运行环境

  • refreshContext(context):准备Bean工厂,调用一个BeanDefinition和BeanFactory的后处理器,初始化各种Bean,初始化tomcat

  • afterRefresh():拓展功能,目前为空

  • 发布容器初始化完毕的事件

1.13. 【13】怎么自定义start组件?

Spring boot的AutoConfiguration机制

标记一个应用为Springboot应用,需要一个SpringBootApplication注解,下面是一个标准的spring boot启动程序。

imgSpringBootApplication

SpringBootApplication注解又被一个EnableAutoConfiguration注解,EnableAutoConfiguration注解就是自动加载配置的关键。

imgSpringBootApplication注解

EnableAutoConfiguration是一个组合注解,用Import把AutoConfigurationImportSelector导入容器中,springboot启动的时候会加载所有的selector并执行selectImports方法,这个方法会加载META-INF/spring.factories中配置的EnableAutoConfiguration,从而加载自动配置。

imgEnableAutoConfiguration

第一步:定义依赖

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-autoconfigure</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-configuration-processor</artifactId>
    </dependency>

第二步:使用条件注解

核心条件注解

注解 描述
@ConditionalOnBean 应用中包含指定bean,配置才生效
@ConditionalOnMissingBean 应用中不包含指定bean,配置才生效
@ConditionalOnClass 应用中包含指定类,配置才生效
@ConditionalOnMissingClass 应用中不包含指定类,配置才生效
@ConditionalOnWebApplication 配置只有在web环境下配置才生效
@ConditionalOnNotWebApplication 配置只有在非web环境下配置才生效
@Conditional 条件判定【】

核心条件顺序注解

注解 描述
@AutoConfigureAfter 在指定配置类加载之后加载
@AutoConfigureBefore 在指定配置类加载之前加载
@AutoConfigureOrder 指定加载配置优先级,默认0

第三步 定义spring.factories image-20201203152825796

results matching ""

    No results matching ""