一、配置优先级
(一)SpringBoot项目中支持的三种配置文件
application.properties
application.yml
application.yaml
可以通过这三种任意一个来配置文件。
-
如果三种配置文件同时存在,且都配置了同一个属性,执行的优先级:
properties、yml、yaml
三种配置文件同时存在,优先级最高的是properties
。yaml
、yaml
两种同时存在,优先级最高的是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类型的数组中,并加载到内存。
- 底层是@import注解,导入了实现
(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
的全类名。
- 在
