当前位置: 首页 > news >正文

SpringBoot原理-自动配置-原理分析-源码跟踪

自动配置原理

  • SpringBootApplication

    • 该注解标识在SpringBoot项目的启动类上,是SpringBoot中最为重要的注解,该注解由三个部分组成。
      • @SpringBootConfiguration:该注解与@Configuration注解作用一样,用来声明当前类为一个配置类
      • @ComponentScan:组件扫描,默认扫描当前启动类所在包及其子包
      • @EnableAutoConfiguration:SpringBoot实现自动化配置的核心注解
        • 该注解是个复合注解,其中封住了一个@Import注解,指定注入到SpringIOC容器中的ImportSelector接口的实现类。
        • 具体参照文章:SpringBoot原理-自动配置-方案_熵240的博客-CSDN博客 
        • 该实现类中实现了该接口(ImportSelector)中selectImports方法,该方法的返回值是我们要导入到IOC容器中的全类名的集合,
        • 在该方法中加载了两个文件 META-INF/springorg.springframework.boot.autoconfigure.AutoConfiguration.imports
          • META-INF/spring目录:这个目录下的文件是Spring Boot自动配置的核心配置文件。在这个目录下,可以定义多个配置文件,每个配置文件对应一个自动配置类。这些配置文件使用了Spring的SPI(Service Provider Interface)机制,通过SpringFactoriesLoader加载并实例化自动配置类。

          • org.springframework.boot.autoconfigure.AutoConfiguration.imports文件:这个文件定义了需要自动导入的其他自动配置类。在自动配置类中,可以使用@Import注解来导入其他自动配置类。而在AutoConfiguration.imports文件中,可以列出需要自动导入的自动配置类的全限定类名,这样在启动时,Spring Boot会自动将这些自动配置类导入到容器中

        • 在imports文件中会定义非常多的自动配置类,配置类当中也会定义很多bean对象,我们可以通过注解来设置将bean对象装配到IOC容器的条件。具体参见文章:SpringBoot原理-自动配置-原理分析-@Conditional_熵240的博客-CSDN博客        

小结 

  • 自动装配简单讲就是将第三方的bean以及配置类装载到IOC容器中,开发人员就不再需要写bean的配置了,自动装配的实现只需要在启动类上加入@SpringBootApplication注解就可以了,而@SpringBootApplication注解是一个复合注解,其中自动装配的实现是通过@EnableAutoConfiguration注解实现的,自动装配的实现主要依靠三个关键的技术。
    • 第一,引入Starter,启动依赖组件的时候,该组件中必须含有@Configuration配置类,在这个配置类中,我们需要通过@Bean注解去声明要装配到IOC容器中的Bean对象
    • 第二,上述配置类是放在第三方的jar包里面,然后通过SpringBoot中约定优于配置的理念去把配置类的全路径放在META-INF/spring.factories文件中,由此SpringBoot就可以知道第三方jar包里面配置类的位置,当Spring Boot启动时,会通过SpringFactoriesLoader加载META-INF/spring.factories文件中定义的自动配置类。然后根据条件注解的判断,决定是否需要进行自动配置。
    • 第三,SpringBoot拿到所有第三方jar包里面声明的配置类之后,在通过Spring提供的ImportSelector接口来实现对于这些配置类的动态加载,从而完成自动装配。该接口的实现类由@EnableAutoConfiguration注解中包含的@Import注解来指定。通过实现该中String[] selectImports()方法,该方法的返回值为需要装入Spring IOC容器中类。
http://www.lryc.cn/news/160886.html

相关文章:

  • 安全基础 --- 原型链污染
  • c++中的常用知识点总结
  • Leetcode:349. 两个数组的交集【题解超详细】
  • Java 【异常】
  • B - Polycarp‘s Practice
  • 朴素贝叶斯数据分类------
  • flask中的操作数据库的插件Flask-SQLAlchemy
  • arrow的使用
  • 【24种设计模式】装饰器模式(Decorator Pattern(Wrapper))
  • 小程序v-for与key值使用
  • Qt包含文件不存在问题解决 QNetworkAccessManager
  • 【视频图像篇】FastStone Capture屏幕长截图软件
  • 【C语言】每日一题(杨氏矩阵查找数)
  • 探究SpringWeb对于请求的处理过程
  • 如何使用Google Compute Engine入门指南快速创建和配置您的云虚拟机实例
  • springMVC中全局异常处理
  • 【Nginx24】Nginx学习:压缩模块Gzip
  • 我的私人笔记(zookeeper分布式安装)
  • 小程序排名优化全攻略
  • MySQL MHA
  • Java API速记手册(持续更新ing...)
  • FANUC机器人电气控制柜内部硬件电路和模块详细介绍
  • LGFormer:LOCAL TO GLOBAL TRANSFORMER FOR VIDEO BASED 3D HUMAN POSE ESTIMATION
  • 数据结构零基础入门篇(C语言实现)
  • Hugging News #0904: 登陆 AWS Marketplace
  • Redis Redis的数据结构 - 通用命令 - String类型命令 - Hash类型命令
  • vue中的几种name属性
  • 论文《面向大规模日志数据分析的自动化日志解析》翻译
  • element-ui dialog弹窗 设置点击空白处不关闭
  • 第16节-PhotoShop基础课程-修复工具组-去水印