zoukankan      html  css  js  c++  java
  • SpringBoot

    1. 为何引入一些SpringBoot依赖的时候,不需要指定版本?

    总结:

    spring-boot-dependencies:作为父工程,存放了SpringBoot的核心依赖。我们在写或者引入一些SpringBoot依赖的时候,不需要指定版本,正是因为SpringBoot的父依赖已经帮我们维护了一套版本。

    细节:

    SpringBoot的pom.xml

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.1.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    SpringBoot的项目都会存在一个父依赖,按住Ctrl+鼠标左键,可以点进去 --> 点进去之后发现里面除了一些插件和配置文件的格式之外,还存在一个依赖spring-boot-dependencies

    于是再点进去,可以发现里面放了很多的依赖和依赖的版本号。

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-dependencies</artifactId>
        <version>2.2.1.RELEASE</version>
        <relativePath>../../spring-boot-dependencies</relativePath>
    </parent>

    另外我们还可以看到,在父依赖中也帮我们写好了资源库,不用我们自己再去配置了。

    <resources>
          <resource>
            <filtering>true</filtering>
            <directory>${basedir}/src/main/resources</directory>
            <includes>
                <!-- 可以读取的配置文件有
                    application.yml/application.yaml/application.properties
                 -->
              <include>**/application*.yml</include>
              <include>**/application*.yaml</include>
              <include>**/application*.properties</include>
            </includes>
          </resource>
          <resource>
            <directory>${basedir}/src/main/resources</directory>
            <excludes>
              <exclude>**/application*.yml</exclude>
              <exclude>**/application*.yaml</exclude>
              <exclude>**/application*.properties</exclude>
            </excludes>
          </resource>
    </resources>

    2. 启动器

    启动器就是SpringBoot的启动场景,比如我们要使用web相关的,那么就直接引入spring-boor-starter-web,那么他就会帮我们自动导入web环境下所有必需的依赖。

    SpringBoot会将所有的功能场景都封装成一个一个的启动器,供开发人员使用。

    3. 【重点】自动装配原理 - SpringBoot主程序

    文字版本(重要,必看):https://zhuanlan.zhihu.com/p/95217578

    当我们的SpringBoot项目启动的时候,会先导入AutoConfigurationImportSelector,

    这个类会帮我们选择所有候选的配置,我们需要导入的配置都是SpringBoot帮我们写好的一个一个的配置类,那么这些配置类的位置,存在与META-INF/spring.factories文件中。

    通过这个文件,Spring可以找到这些配置类的位置,于是去加载其中的配置。

    1-@SpringBootApplication注解,正是SpringBoot项目启动的核心。其包含:

    • @SpringBootConfiguration//核心
    • @EnableAutoConfiguration//核心

    2-@SpringBootConfiguration其实就携带了一个@Configuration注解,这个注解我们再熟悉不过了,他就代表自己是一个Spring的配置类。所以我们可以认为:@SpringBootConfiguration = @Configuration

    3-@EnableAutoConfiguration,顾名思义,这个注解一定和自动配置相关。其包含:

    • @AutoConfigurationPackage //自动配置包
    • @Import(AutoConfigurationImportSelector.class)//自动配置导入选择

    4-@Import(AutoConfigurationImportSelector.class),帮我们导入了AutoConfigurationImportSelector,这个类中存在一个方法 getCandidateConfigurations() 可以帮我们从META-INF/spring.factories获取所有的配置。 

    5-META-INF/spring.factories

    可以看到里面包含了很多自动配置属性:

    6-我们可以随便找一个自动配置点进去,比如WebMvcAutoConfiguration

    这里放了所有关于WebMvc的配置,如视图解析器、国际化等等。

    @ConditionalOnXXX:如果其中的条件都满足,该类才会生效。

    所以在加载自动配置类的时候,并不是将spring.factories的配置全量加载进来,而是通过这个注解的判断,如果注解中的类都存在,才会进行加载。

    所以就实现了:我们在pom.xml文件中加入stater启动器,SpringBoot自动进行配置。完成开箱即用。

     

    4. 【重点】spring.factories文件 与 yaml主配置文件 的关系

    问题:我们在application.yaml主配置文件(详见:主配置文件applicaton.yaml解析)里写的配置,是如何作用于/override默认的配置呢?

    答案:

    xxxAutoConfiguration.class --> xxxProperties.class --> application.yaml

    在第3节解释【springboot 自动装配流程图】中,有一个关键配置文件spring-boot-autoconfigure的META-INF/spring.factories。可以看到【spring.factories】里面的类都是以xxxAutoConfiguration结尾的。这里以HttpEncodingAutoConfiguration.java为例:

    1) 原本,springboot通过【HttpEncodingAutoConfiguration.java】里@EnableConfigurationProperties(HttpProperties.class),会从HttpProperties.class读取默认配置

    2) HttpProperties.class里还有个的 @ConfigurationProperties(prefix = "string.http")注解,通过这个注解与application.yaml链接了起来。只要在yaml中写入的相应的"string.http.xxx",就能override原有配置

    【springboot 自动装配流程图】

    【spring.factories】

    【HttpEncodingAutoConfiguration.java】

    通过【HttpEncodingAutoConfiguration.java】里@EnableConfigurationProperties(HttpProperties.class) 里的 @ConfigurationProperties(prefix = "string.http"),与application.yaml链接了起来

    【HttpProperties.class】

  • 相关阅读:
    CLR c++/CLI 如何返回多个返回值
    在php 中显示array数据
    MVC已死,该是用MOVE的时候了
    拿到网规证书后,办北京户口的遭遇。
    利亚德股票限售股解禁表
    32位MSSQL数据库备份如何在64位MSSQL数据库上恢复
    利用DNS实现负载均衡
    购买服务器具体和什么参数有关
    简单来总结一下C++与C#之间的区别
    c# 操作DOS ping命令判断与指定主机是否可以通信
  • 原文地址:https://www.cnblogs.com/frankcui/p/14091268.html
Copyright © 2011-2022 走看看