Springboot自动装配原理探究

Springboot自动装配原理探究,第1张

Springboot自动装配原理探究 Springboot自动装配原理 springboot的开箱即用原则

开箱即用:在开发过程中,通过maven项目的pom文件中添加相关依赖包,然后通过相应的注解来代替繁琐的XML配置以管理对象的生命周期。

从pom.xml中解读springboot的开箱即用原则。

spring-boot-dependencies:作为父工程,存放了SpringBoot的核心依赖

好处
  • 我们在写或者引入一些SpringBoot依赖的时候,不再需要指定版本,因为SpringBoot的父依赖已经帮我们维护了一套版本。
  • 在父依赖中也帮我们写好了资源库,不用我们自己再去配置了。
演示

SpringBoot的项目都会存在一个父依赖,按住Ctrl+鼠标左键,可以点进去。


    org.springframework.boot
    spring-boot-starter-parent
    2.2.1.RELEASE
     

点进去之后发现里面除了一些插件和配置文件的格式之外,还存在一个依赖。


    org.springframework.boot
    spring-boot-dependencies
    2.2.1.RELEASE
    ../../spring-boot-dependencies

于是再点进去,可以发现里面放了很多的依赖和依赖的版本号。由于这个文件实在太长了,所以这里只展示一部分。


      
        true
        ${basedir}/src/main/resources
        
            
          **/application*.yml
          **/application*.yaml
          **/application*.properties
        
      
      
        ${basedir}/src/main/resources
        
          **/application*.yml
          **/application*.yaml
          **/application*.properties
        
      

启动器为我们提供一键式启动场景

    org.springframework.boot
    spring-boot-starter
    2.2.1.RELEASE

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

我们来看看启动器中存放了一些什么内容:

以spring-boot-starter启动场景为例:


      org.springframework.boot
      spring-boot
      2.2.1.RELEASE
      compile
    
    # 自动配置相关的依赖
    
      org.springframework.boot
      spring-boot-autoconfigure
      2.2.1.RELEASE
      compile
    
    # 日志相关依赖
    
      org.springframework.boot
      spring-boot-starter-logging
      2.2.1.RELEASE
      compile
    
	# Spring-core依赖
    
      org.springframework
      spring-core
      5.2.1.RELEASE
      compile
    
其中存放了自动配置相关的依赖、日志相关依赖、还有Spring-core等依赖,这些依赖我们只需要导入一个spring-boor-starter就可以直接将其全部引入,而不需要再像以前那样逐个导入了。

SpringBoot会将所有的功能场景都封装成一个一个的启动器,供开发人员使用。
我们在使用的时候也可以直接去官网上找我们所需的启动器,直接将其引入。

获取启动器文档:

https://docs.spring.io/spring-boot/docs/2.2.1.RELEASE/reference/html/using-spring-boot.html#using-boot-starter

如下图所示:


从主程序解读springboot的自动装配原则
//@SpringBootApplication 标注,是一个SpringBoot应用
@SpringBootApplication
public class SpringbootdemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringbootdemoApplication.class, args);
    }
}

再写SpringBoot项目的时候,总要写这么一个主程序,这个主程序最大的特点就是其类上放了一个@SpringBootApplication注解,这也正是SpringBoot项目启动的核心,也是我们要研究的重点。

总结:当我们的SpringBoot项目启动的时候,所有的自动配置都进行了扫描并加载。spring.factories所有的自动配置类都在这里,但是不一定生效,要@ConditionalOnClass注解进行判断条件是否成立(只要导入相应的stater,条件就能成立),只要导入了对应的start,就有对应的启动器了,有了启动器,我们自动装配就会生效,然后就配置成功了。从以上思维导图的源码探究中,我们验证了主程序的自动装配原理。

梳理注解@SpringBootApplication自动装配的过程

  1. SpringBoot在启动的时候从类路径下的meta-INF/spring.factories中获取
  2. 将这些值作为自动配置类导入容器 , 自动配置类就生效 , 帮我们进行自动配置工作;
  3. 以前我们需要自己配置的东西 , 自动配置类都帮我们解决了!
  4. 整个J2EE的整体解决方案和自动配置都在springboot-autoconfigure的jar包中;
  5. 它将所有需要导入的组件以全类名的方式返回 , 这些组件就会被添加到容器中 ;
  6. 容器中存在非常多的xxxAutoConfiguration的文件(@Bean), 就是这些类给容器中导入这个场景需要的所有组件,并配置好这些组件 ;@Configuration,JavaConfig!
  7. 有了自动配置类 , 免去了我们手动编写配置文件的工作。
    摘自博客:
    https://link.zhihu.com/?target=https%3A//blog.kuangstudy.com/index.php/archives/630/
梳理springboot的主启动类自动装配的过程 SpringApplication

1、推断应用的类型是普通的项目还是Web项目
2、查找并加载所有可用初始化器 , 设置到initializers属性中
3、找出所有的应用程序监听器,设置到listeners属性中
4、推断并设置main方法的定义类,找到运行的主类
查看构造器:

public SpringApplication(ResourceLoader resourceLoader, Class... primarySources) {
    // ......
    this.webApplicationType = WebApplicationType.deduceFromClasspath();
    this.setInitializers(this.getSpringFactoriesInstances();
    this.setListeners(this.getSpringFactoriesInstances(ApplicationListener.class));
    this.mainApplicationClass = this.deduceMainApplicationClass();
}
run方法流程分析


引自kuangshen笔记

SpringBoot:yaml配置注入 配置文件

SpringBoot使用一个全局的配置文件 , 配置文件名称是固定的

application.properties
语法结构 :key=value

application.yml
语法结构 :key:空格 value
**配置文件的作用 :**修改SpringBoot自动配置的默认值,因为SpringBoot在底层都给我们自动配置好了;
比如我们可以在配置文件中修改Tomcat 默认启动的端口号!测试一下!

server.port=8081
yaml概述

说明:语法要求严格!
1、空格不能省略
2、以缩进来控制层级关系,只要是左边对齐的一列数据都是同一个层级的。
3、属性和值的大小写都是十分敏感的。
字面量:普通的值 [ 数字,布尔值,字符串 ]
字面量直接写在后面就可以 , 字符串默认不用加上双引号或者单引号;

注意:

1.“ ” 双引号,不会转义字符串里面的特殊字符 , 特殊字符会作为本身想表示的意思;
比如 :name: “kuang n shen” 输出 :kuang 换行 shen

2.’’ 单引号,会转义特殊字符 , 特殊字符最终会变成和普通字符一样输出
比如 :name: ‘kuang n shen’ 输出 :kuang n shen

对象、Map(键值对)

#对象、Map格式
k: 
    v1:
    v2:

在下一行来写对象的属性和值得关系,注意缩进;比如:

student:
    name: qinjiang
    age: 3

行内写法

student: {name: qinjiang,age: 3}

数组( List、set )
用 - 值表示数组中的一个元素,比如:

pets:
 - cat
 - dog
 - pig

行内写法

pets: [cat,dog,pig]

注入配置文件
yaml文件更强大的地方在于,他可以给我们的实体类直接注入匹配值!

yaml注入配置文件&JSR303数据校验及多环境切换&多配置文件(含与properties对比)

演示步骤及其效果见以下链接
yaml绑定实体类示范链接

总结:
yaml无论语法上,还是属性注入,还是配置文件的书写/关联方面,都全面优秀于properties文件格式。这是springboot极力推荐它的原因!

自动配置原理再理解(进阶)

自动配置原理再理解进阶

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/4828842.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-10
下一篇 2022-11-10

发表评论

登录后才能评论

评论列表(0条)

保存