• Day93.SpringBoot: 配置、使用、原理


    目录

    一、SpringBoot概述

    二、使用springboot

    二、配置文件详解

    1. 属性配置文件

    2. YAML配置文件 

    3. 多环境profile切换配置

    三、Spring Boot自动配置(理解)

    条件化配置注解

    四、自动配置原理

    默认属性配置

    覆盖默认属性配置


    一、SpringBoot概述

    Spring Boot是Spring项目中的一个子工程,与我们所熟知的Spring-framework 同属于spring的产品。其最主要作用就是帮助开发人员快速的构建庞大的spring项目,并且尽可能的减少一切xml配置,做到开箱即用,迅速上手,让开发人员关注业务而非配置。
    设计目的: 用来简化 Spring 应用的初始搭建以及开发过程。

    主要特点:

    1. 自动配置 : 不需要再关注各个框架的整合配置, springboot全部已经配置好了
    2. 起步依赖 : 我们在需要使用某个框架的时候, 直接添加这个框架的启动器依赖即可 , 不需要在关注jar包的冲突和整合

    二、使用springboot

    1. pom.xml 添加父工程坐标、web启动器

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <project xmlns="http://maven.apache.org/POM/4.0.0"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    5. <modelVersion>4.0.0</modelVersion>
    6. <groupId>com.atguigu</groupId>
    7. <artifactId>springboot_01</artifactId>
    8. <version>1.0</version>
    9. <!--为什么我们在添加启动器的时候不需要添加版本?
    10. 答:父工程帮我们统一管理
    11. -->
    12. <!--添加父工程坐标-->
    13. <parent>
    14. <groupId>org.springframework.boot</groupId>
    15. <artifactId>spring-boot-starter-parent</artifactId>
    16. <version>2.3.6.RELEASE</version>
    17. </parent>
    18. <!--
    19. 为什么我们就只添加了一个启动器依赖,项目就可以运行起来了,这些jar包从何而来?
    20. 答:引入启动器,间接依赖了很多jar包,从本地仓库进行依赖注入
    21. -->
    22. <!--添加web启动器,框架提供了很多启动器(起步依赖),其实就是一组jar包的名称
    23. web启动器: 引入web开发相关的jar
    24. -->
    25. <dependencies>
    26. <dependency>
    27. <groupId>org.springframework.boot</groupId>
    28. <artifactId>spring-boot-starter-web</artifactId>
    29. </dependency>
    30. </dependencies>
    31. <!--可选,jdk版本-->
    32. <properties>
    33. <java.version>1.8</java.version>
    34. </properties>
    35. </project>

    2. 创建启动类

    Spring Boot项目通过main函数即可启动,我们需要创建一个启动类:

    1. @SpringBootApplication //s声明当前项目是一个SpringBoot项目
    2. public class App {
    3. //启动内置的Tomcat服务器,即初始化Ioc容器(采用框架默认配置)
    4. public static void main(String[] args) {
    5. SpringApplication.run(App.class,args);
    6. }
    7. }

    3. 编写Controller

    1. @RestController //相当于 @Controller + @ResponseBody
    2. public class HelloController {
    3. @RequestMapping("/hello")
    4. public String sayHello(){
    5. return "hello spring boot!!" ;
    6. }
    7. }

    4. 启动测试

     

    5. 问题

    1、为什么我们在添加启动器的时候不需要在启动器的坐标中指定版本?

    答案:因为我们指定了项目的父工程,在spring-boot-starter-parent中已经通过Maven的版本锁定了Jar包的版本,所以就不需要再指定了。

    2、为什么我们就添加一个启动器依赖,项目就可以运行起来了,运行项目所需要的Jar包从何而来?

    答案:因为我们添加了这个启动器的依赖,它已经把自己运行所需要的必要包集成在这个启动器中,通过Maven的依赖传递性,将这些包都依赖到咱们的项目里了。

    二、配置文件详解

    springboot支持二种类型的配置文件

    • properties属性配置文件
    • yaml配置文件

    配置文件必须放置在项目的类加载目录下, 并且名字必须是 application,springboot项目在运行的时候会自动加载这些配置文件

    1. 属性配置文件

    1. spring.jdbc.datasource.driverClassName=com.mysql.cj.jdbc.Driver
    2. spring.jdbc.datasource.url=jdbc:mysql://localhost:3306/db_house?characterEncoding=utf8&amp;serverTimezone=Asia/Shanghai&amp;allowPublicKeyRetrieval=true
    3. spring.jdbc.datasource.username=root
    4. spring.jdbc.datasource.password=******

     新建 properties 包,创建类 DataSourceProperties 

    1. package com.atguigu.properties;
    2. import org.springframework.beans.factory.annotation.Value;
    3. import org.springframework.stereotype.Component;
    4. @Component
    5. public class DataSourceProperties {
    6. // @Value 可以获取属性配置文件的属性值,无需get/set方法。缺点:需要一个一个获取
    7. @Value("${spring.jdbc.datasource.driverClassName}")
    8. private String driverClassName;
    9. @Value("${spring.jdbc.datasource.url}")
    10. private String url;
    11. @Value("${spring.jdbc.datasource.username}")
    12. private String username;
    13. @Value("${spring.jdbc.datasource.password}")
    14. private String password;
    15. // 生成get set 和 toString方法
    16. }

    测试:

     成功注入

    2. YAML配置文件 

    YAML是一种配置文件格式,扩展名是 yaml yml

    1.数据结构用树形结构呈现,通过缩进来表示层级,

    2.连续的项目通过减号 ” - ” 来表示

    3.键值结构里面的key/value对用冒号 ” : ” 来分隔。

     spring:

      jdbc:

        datasource:

          driverClassName: com.mysql.jdbc.Driver

          url: jdbc:mysql:///springboot_01

          username: root

          password: root

    yml配置文件的特征:

    1. 树状层级结构展示配置项;
    2. 配置项之间如果有关系的话需要分行空两格;
    3. 配置项如果有值的话,那么需要在 :之后空一格再写配置项值;

    3. 多环境profile切换配置

    在Spring Boot项目中配置文件的名称只能是**application** , 如果我们把所有的配置项全都写在一个配置文件中, 配置文件就会比较复杂和臃肿,不利于后期的项目维护和开发。

    1.因为开发环境的变化, 我们需要修改配置文件中某一个配置项的值(比如之前是mysql数据库,切换成oracle数据库)

    2.项目开发完成需要上线了 , 需要把一些环境修改成正式环境(开发测试上线,多环境切换)

    解决方案 :使用profiles拆分配置

    spring boot项目中允许使用多个YAML配置文件。

    这些文件名称必须为application-***.yml,并且在application.yml中激活。

    1. spring:
    2. profiles:
    3. active: dev

     注意 :

    如果propertiesyml文件都存在,不存在spring.profiles.active设置,如果有重叠属性,默认以properties优先。

    如果设置了spring.profiles.active,并且有重叠属性,以active设置优先。

    可以在两种文件中分别增加server.port属性指定不同的端口,启动项目查看控制台端口号进行测试。

    三、Spring Boot自动配置(理解)

    @SpringBootApplication 注解

    • @SpringBootConfiguration : 代表这个类就是一个配置类 , 本质上就是一个@Configuration注解
    • @EnableAutoConfiguration : 自动配置注解 , 添加了此注解会自动读取spring.factories配置文件中的自动配置类
    • @ComponentScan : 组件扫描, 默认扫描启动类所在包及子包下的类身上的注解

    @ConfigurationProperties(prefix = "xxx") 注解

    • @ConfigurationProperties是SpringBoot提供的重要注解, 他可以将一些配置属性批量注入到bean对象(需要提供get set方法)。(@Value 注解需要属性需要一个一个获取)

    报错提示,请在pom文件添加配置信息即可(不影响运行)

    1. <dependency>
    2. <groupId>org.springframework.boot</groupId>
    3. <artifactId>spring-boot-configuration-processor</artifactId>
    4. <optional>true</optional>
    5. </dependency>

    @Value 一个个注入 

    1. // @Value 可以获取属性配置文件的属性值,无需get/set方法。缺点:需要一个一个获取
    2. @Value("${spring.jdbc.datasource.driverClassName}")
    3. private String driverClassName;
    4. @Value("${spring.jdbc.datasource.url}")
    5. private String url;
    6. @Value("${spring.jdbc.datasource.username}")
    7. private String username;
    8. @Value("${spring.jdbc.datasource.password}")
    9. private String password;

    条件化配置注解

    注解

    作用

    @ConditionalOnBean

    如果存在某个Bean, 配置类生效

    @ConditionalOnMissingBean

    如果不存在某个Bean, 配置类生效

    @ConditionalOnClass

    如果存在某个类, 配置类生效

    @ConditionalOnMissingClass

    如果不存在某个类, 配置类生效

    @ConditionalOnProperty

    如果存在某个属性配置, 配置类生效

    @ConditionalOnWebApplication

    如果是一个web应用, 配置类生效

    @ConditionalOnNotWebApplication

    如果不是一个web应用, 配置类生效

    1. @RestController //相当于 @Controller + @ResponseBody
    2. //启用属性配置类,带@ConfigurationProperties属性的类要先生效
    3. @EnableConfigurationProperties(value = {DataSourceProperties.class})
    4. public class HelloController {
    5. @Autowired
    6. DataSourceProperties dataSourceProperties;
    7. @RequestMapping("/hello")
    8. public String sayHello(){
    9. System.out.println(dataSourceProperties);
    10. return "hello spring boot!!" ;
    11. }
    12. }

    四、自动配置原理

    1. @SpringBootApplication //声明当前项目是一个SpringBoot项目
    2. public class App {
    3. //启动内置的Tomcat服务器,即初始化Ioc容器(采用框架默认配置)
    4. public static void main(String[] args) {
    5. /*
    6. * 自动配置初始化过程:
    7. * 1.从加载jar包中查找META-INF/spring.factories文件,构造出一些工厂对象,来初始化总起
    8. * 2.会查找org.springframework.boot.autoconfigure.EnableAutoConfiguration名称的值。
    9. * 获取了127个配置类。
    10. * Springboot框架与其他框架继承,提供大量配置类,简化了框架集成过程。可以提高开发效率
    11. * 例如: 引入了spring-boot-starter-web启动器
    12. * HttpEncodingAutoConfiguration 自动配置字符编码过滤器.相当于web.xml配置,默认utf-8
    13. * MultipartAutoConfiguration 文件上传解析器
    14. * WebMvcAutoConfiguration 负责创建视图解析器
    15. * DispatcherServletAutoConfiguration 负责创建核心控制器
    16. *
    17. *
    18. * */
    19. SpringApplication.run(App.class,args);
    20. }
    21. }

    彩蛋 :英俊的张老师

     

     在SpringApplication类构建的时候,有这样一段初始化代码:

     跟进去往下走

     这里发现会通过loadFactoryNames尝试加载一些FactoryName,然后利用createSpringFactoriesInstances将这些加载到的类名进行实例化。 继续跟进loadFactoryNames方法: 发现此处会利用类加载器加载一个文件: META-INF/spring.factories 。我们知道,ClassLoader默认是从classpath下读取文件,因此,SpringBoot会在初始化的时候,加载所有classpath:META-INF/spring.factories文件,包括jar包当中的。而在Spring的一个依赖包:spring-boot-autoconfigure中,就有这样的文件:

    我们引入的任何第三方启动器,只要实现自动配置,也都会有类似文件。

    打开后,可以发现以EnableAutoConfiguration接口为key的一系列配置,key所对应的值,就是所有的自动配置类,可以在当前的jar包中找到这些自动配置类,几乎涵盖了现在主流的开源框架

    默认属性配置

    配置类我们找到了 , 那么这些默认配置的属性来自哪里呢?

    例如 : 我们配置视图解析器的时候需要配置前缀和后缀 , 那么这些配置在哪配置的呢 ?

    通过源码发现, 这个配置是从this.mvcProperties.getView()中读取的 ,this.mvcProperties又是什么呢 ? 我们继续跟踪,发现其实就是定义的一个变量

     这个变量中又有一个View类型的变量 , 这个变量中配置的就是前缀和后缀,默认为null  

    覆盖默认属性配置

  • 相关阅读:
    【FTP】一、什么是FTP?
    写给所有程序员的对象的一封信
    常见排序算法
    C练习题_14
    面向对象三大特征之多态
    用Python抓取京东商品评论
    Yolov8改进交流
    关于类的定义
    Jmeter正则提取数据
    操作系统内存换出---15
  • 原文地址:https://blog.csdn.net/a111042555/article/details/125527210