SpringBoot的依赖管理和自动配置

2023-12-14 19:59:36

与其明天开始,不如现在行动!


1 依赖管理机制

  1. 为什么导入starter-web后所有相关依赖都会导入进来?

    1. 开发什么场景,导入什么场景启动器-spring-boot-starter-
    2. maven依赖传递原则,a-b-c:a就拥有c
    3. 导入一个场景启动器,就会自动把整个场景的所有核心依赖全部导入进来
  2. 为什么版本号都不用写?

    1. 每个boot项目都有一个父项目:spring-boot-starter-parent

    2. parent的父项目是:spring-boot-dependencies

    3. 在里面版本仲裁中心就写好了每个jar包的版本

    4. 要自定义版本号

      1. 直接在依赖下面声明版本号
      2. 利用maven的就近原则
        • 直接在当前项目使用<properties>标签
      <properties>
      	<mysql.version>8.0.31</mysql.version>
      </properties>
      
    5. 第三方jar包要自己声明

image-20231206142937666

2 自动配置机制

2.1 初步理解

  1. 自动配置的Tomcat、SpringMVC等
    1. 以前:要配置一堆的组件
    2. 现在:SpringBoot自动配置好这些组件,容器中有了什么组件,就具有什么功能
    3. 导入场景,容器中就会自动配置好这个场景的核心组件
  2. 默认的包扫描规则
    1. @SpringBootApplication注解的类就是主程序
    2. SpringBoot只会扫描主程序所在的包及其下面的子包:com.wen.usercenter及其子包
  3. 配置默认值
    1. 配置文件(如:application.properties)的所有配置项是和某个类的对象值进行一一绑定的
    2. 绑定了配置文件中每一项值的类:配置属性类
  4. 按需加载自动配置
    1. 导入场景spring-boot-starter-web
    2. 场景启动器除了会导入相关依赖,还导入一个spring-boot-starter,是所有starterstarter,基础核心starter
    3. spring-boot-starter导入了一个包spring-boot-autoconfigure。包里面都是各种场景的AutoConfiguration自动配置类
    4. 虽然全场景的自动配置都在spring-boot-autoconfigure这个包,但是不是全部开启的。导入哪个场景就开启哪个。

总结:导入场景启动器,触发spring-boot-autoconfigure这个包的自动配置生效,容器中就会具有相关的功能

2.2 完整流程

思考:

  1. SpringBoot怎么实现导入一个starter,写一些简单的配置,应用就能跑起来,我们无需关心整合?
  2. 为什么Tomcat的端口号可以配置在application.properties中,并且Tomcat能启动成功?
  3. 导入场景后哪些自动配置能生效?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

流程:

  1. 导入stater:导入了web开发场景
    1. 场景启动器导入了相关场景的所有依赖:starter-jsonstarter-tomcatspringmvc
    2. 每个场景启动器都引入了一个spring-boot-starter核心场景启动器
    3. 核心场景启动器引入了spring-boot-autoconfigure自动配置包,里面囊括了所有场景的所有配置
    4. 只要这个包下的所有类都能生效,那么相当于SpringBoot官方写好的整合功能就生效了
    5. SpringBoot默认扫描不到spring-boot-autoconfigure下写好的所有配置类
  2. 主程序:@SpringBootApplication
    1. @SpringBootApplication由三个注解组成:@SpringBootConfiguration@EnableAutoConfiguration@ComponentScan
    2. SpringBoot默认扫描不到spring-boot-autoconfigure下写好的所有配置类
    3. @EnableAutoConfiguration:SpringBoot开启自动配置的核心。
      1. 是由@Import({AutoConfigurationImportSelector.class})提供功能:批量给容器中导入组件
      2. SpringBoot启动会默认加载142个配置类
      3. 这142个配置类来自于spring-boot-autoconfigure包下META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件指定的所有类
      4. 项目启动的时候利用@Import批量导入组件机制把autoconfigure包下的142个xxxAutoConfiguration类导入进来(自动配置类)
      5. 按需生效:
        1. 虽然导入了142个自动配置类,但是并不是都能生效
        2. 每个自动配置类,都有条件注解@ConditionOnXxx,只有条件成立,才能生效
      6. xxxAutoConfiguration自动配置类
        1. 给容器中使用@Bean放一堆组件
        2. 每个自动配置类都有可能由注解:@EnableConfigurationProperties(ServerProperties.class),用来把配置文件中配的指定前缀的属性值封装到xxxProperties属性类
        3. 以Tomcat为例,把服务器的所有配置都是以server开头的。配置都封装到属性类中
        4. 给容器中放的所有组件的一些核心参数,都来自于xxxPropertiesxxxProperties都适合配置文件绑定的
        5. 只需要改配置文件的值,核心组件的底层参数都能修改
  3. 写业务,无需关心各种整合(底层这些整合都写好了,而且也生效了)

核心流程:

  1. 导入starter,就会导入autoconfigure
  2. autoconfigure包里面有一个文件META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports,里面指定了所有启动要加载的自动配置类
  3. @EnableAutoConfiguration会自动的把上面文件里面写的所有自动配置类都导入进来。
  4. xxxAutoConfiguration给容器中导入很多组件,根据条件注解按需加载 ,组件都是从xxxProperties中提取属性值
  5. xxxProperties又是和配置文件进行绑定

效果:导入starter、修i该配置文件、就能修改底层行为


💎总结

本文中若是有出现的错误请在评论区或者私信指出,我再进行改正优化,如果文章对你有所帮助,请给博主一个宝贵的三连,感谢大家😘!!!


文章来源:https://blog.csdn.net/weixin_54620350/article/details/134899497
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。