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的全类名。
相关推荐
做运维的阿瑞1 小时前
Python零基础入门:30分钟掌握核心语法与实战应用
开发语言·后端·python·算法·系统架构
猿究院-陆昱泽2 小时前
Redis 五大核心数据结构知识点梳理
redis·后端·中间件
yuriy.wang2 小时前
Spring IOC源码篇五 核心方法obtainFreshBeanFactory.doLoadBeanDefinitions
java·后端·spring
咖啡教室4 小时前
程序员应该掌握的网络命令telnet、ping和curl
运维·后端
你的人类朋友5 小时前
Let‘s Encrypt 免费获取 SSL、TLS 证书的原理
后端
老葱头蒸鸡5 小时前
(14)ASP.NET Core2.2 中的日志记录
后端·asp.net
李昊哲小课6 小时前
Spring Boot 基础教程
java·大数据·spring boot·后端
码事漫谈6 小时前
C++内存越界的幽灵:为什么代码运行正常,free时却崩溃了?
后端
Swift社区6 小时前
Spring Boot 3.x + Security + OpenFeign:如何避免内部服务调用被重复拦截?
java·spring boot·后端
90后的晨仔6 小时前
Mac 上配置多个 Gitee 账号的完整教程
前端·后端