SpringBoot原理

一、配置优先级

(一)SpringBoot项目中支持的三种配置文件

application.properties

application.yml

application.yaml

可以通过这三种任意一个来配置文件。

  • 如果三种配置文件同时存在,且都配置了同一个属性,执行的优先级:

    • properties、yml、yaml 三种配置文件同时存在,优先级最高的是properties
    • yamlyaml两种同时存在,优先级最高的是yml

所以配置文件优先级的的排名:

1.properties配置文件

2.yml配置文件

3.yaml配置文件

注意:

  • 虽然springboot支持多种格式的配置文件,但是但项目开发的时候,推荐统一使用一种格式的配置(yml是主流)。

(二)Java系统属性和命令行参数

1、在除了配置文件的方式之外,springboot还支持另外两种常用的配置方式:

(1)Java系统属性配置(格式为:-Dkey=value)

(2)命令行参数(格式为:--key=value)

2、指定Java系统属性和命令行参数的方法:

(1)编辑启动程序的配置信息

(2)打开之后,选择 Modify options , 选择 Add VM options, Program arguments

如果同时配置application.properties、系统文件和命令行参数。

  • 优先级最高的是命令行参数,同时配置命令行参数的配置项生效。

(三)五种配置方式的优先级

  • 命令行参数>系统属性参数>properties参数>yml参数>ymal参数。

打包程序运行时指定Java系统属性和命令行参数。

  • 1.执行maven打包指令package,把项目打成jar文件。

  • 2.使用命令:java-jar方式运行jar文件程序。

    • (1)同时设置Java系统属性和命令行参数。
    • (2)仅设置Java系统属性。

注意事项:

  • Springboot项目进行打包时,需要引入插件 spring-boot-maven-plugin (基于官网骨架创建项目,会自动添加该插件)。

二、Bean的管理

(一)Bean的作用域

1.在spring容器中,默认bean是单例的(只有一个实例对象)。

2.设置bean的作用域

可以借助@Scope注解进行配置作用域。

注意事项:

  • IOC容器中的bean默认使用的作用域:singleton (单例)。
  • 默认singleton的bean,在容器启动时被创建,可以使用@Lazy注解来延迟初始化(延迟到第一次使用时)。
  • prototype的bean,每一次使用该bean的时候都会创建一个新的实例。
  • 实际开发当中,绝大部分的Bean是单例的,也就是说绝大部分Bean不需要配置scope属性。

(二)第三方的bean

如果在开发中我们引入的第三方依赖中提供的,无法使用@component及其衍生注解来声明bean的,此时就需要使用@bean注解来声明bean

  • 要管理第三方的bean对象,建议将这些bean集中分类配置,可以通过@Configurtion注解来声明一个配置类(推荐)。

注意事项:

  • 通过@Bean注解的name 或 value属性可以声明bean的名称,如果不指定,默认bean的名称就是方法名。
  • 如果第三方bean需要依赖其他bean对象,直接在bean定义方法中设置形参即可,容器会根据类型自动装配。

三、SpringBoot原理

  • 通过SpringBoot所提供的起步依赖,就可以大大的简化pom文件当中依赖的配置,从而解决了Spring框架当中依赖配置繁琐的问题。
  • 通过自动配置的功能就可以大大的简化框架在使用时bean的声明以及bean的配置。我们只需要引入程序开发时所需要的起步依赖,项目开发时所用到常见的配置都已经有了,我们直接使用就可以了。

(一)起步依赖

原理就是maven的依赖传递

(二)自动配置

概念:自动配置就是当spring容器启动后,一些配置类、bean对象就自动存入到了IOC容器中,不需要手动取声明。

1、实现方案
  • @ComponentScan组件扫描

  • @Import 导入(使用@Import导入的类会被Spring加载到IOC容器中)

    • 使用@Import导入普通类
    • 使用@Import导入配置类
    • 使用@Import导入ImportSelector接口实现类
  • 使用第三方依赖提供的 @EnableXxxxx注解

    • 使用时只需在启动类上加上@EnableXxxxx注解即可
2、原理分析

(1)一个注解

@SpringBootConfiguration是启动类的注解,是一个复合注解,包含以下三个注解:

  • @SpringBootConfiguration

    • 底层是@Configuration,表明启动类是一个配置类,可以在内部定义相关的bean。
  • @Componentscan

    • 是用来组件扫描的,扫描启动类所在的包及其子包下的@Conponent及其衍生注解声明的类。
  • @EnableAutoConfiguration

    • 底层是@import注解,导入了实现ImportSelector接口的实现类AutoConfigurationImportSector
    • AutoConfigurationImportSector重写了ImportSelector接口的selectImport()方法。
    • selectImport()方法调用了getAutoConfigurationEntry()方法,获取所有基于META-INF/spring/org.springframwork.boot.autoconfigure.AutoConfiguration.imports文件内容。将这些文件内容筛选满足starter和各种Condtional条件的全类名封装到spring类型的数组中,并加载到内存。

(2)一个方法SpringApplication.run(引导类.class, args);

启动类会通过run方法去创建与初始化Spring容器,在初始化时会把上面的疏解加载到内存中的字符串数组对应的内容 ,创建成对象注入到Spring容器。

(三)自定义starter

1、首先定义一个名为xxxx-boot-starter 的模块

  • 只管理依赖,导入下面的xxxx-boot-autoconfigyre 依赖,不写代码

2、再定义一个xxxx-boot-autoconfigyre 的模块

  • 完成功能代码

  • 定义一个xxxxAutoConfiguration

    • 完成bean的创建和注入
  • 通过Spring自动化装配原理完成xxxxAutoConfiguration类的初始化

    • META-INF/spring/org.springframwork.boot.autoconfigure.AutoConfiguration.imports文件中写入xxxxAutoConfiguration的全类名。
相关推荐
用户83562907805117 分钟前
C# 从 PDF 提取图片教程
后端·c#
L2ncE42 分钟前
高并发场景数据与一致性的简单思考
java·后端·架构
水涵幽树1 小时前
MySQL 时间筛选避坑指南:为什么格式化字符串比较会出错?
数据库·后端·sql·mysql·database
ERP老兵_冷溪虎山1 小时前
从ASCII到Unicode:"国际正则"|"表达式"跨国界实战指南(附四大语言支持对比+中医HIS类比映射表)
后端·面试
HyggeBest1 小时前
Golang 并发原语 Sync Cond
后端·架构·go
老张聊数据集成1 小时前
数据建模怎么做?一文讲清数据建模全流程
后端
颜如玉2 小时前
Kernel bypass技术遥望
后端·性能优化·操作系统
一块plus2 小时前
创造 Solidity、提出 Web3 的他回来了!Gavin Wood 这次将带领波卡走向何处?
javascript·后端·面试
用户298698530142 小时前
C#代码:Word文档加密与解密(Spire.Doc)
后端
海海思思2 小时前
Go结构体字段提升与内存布局完全指南:从报错解析到高效实践
后端