- 常见配置项
配置对我们来说最常见的就是我们项目开发中.properties或这个.ymal文件中的配置项;
我们在启动jar文件时输入的java -jar xxx.jar name=张三 pwa=123这些配置项;
在idea的配置项Program argument中的配置项,这些都是和我们开发息息相关的配置项; - 其他配置项
但其实配置还包括环境变量(如JAVA_HOME,MAVEN_HOME)等配置;
还有JVM和操作系统相关的配置项,这些都属于配置项;
1.2、配置格式是什么:环境变量配置和JVM等相关配置JDK分别使用Map
getenv = System.getenv()和Properties properties = System.getProperties()帮我们进行了封装;我们只需要获取Map集合或Properties对象就可以获取以上配置项内容;
其他配置中,系统相关的配置项和值不是用户自定义的,是取自JVM和操作系统的固有属性,不像常见配置一样可以自定义;
根据.properties和.yaml配置文件中的配置格式,idea和jar包命令启动配置参数格式,以及JDK封装的环境变量和系统参数的配置格式我们可以得出配置项的格式就是key-value的格式;实际上不仅JDK,Spring中也是采用Property这种key-value方式来存储配置项的;
1.3、Spring中的外部配置- Spring中的外部配置指的是什么
以上的配置项对Spring项目来说都是外部传进来的配置,所以将这些配置统一称为外部配置;并且将这些配置保存在Properties对象中。 - Spring外部配置分类
因为配置的方式多种多样的,有配置文件的,有系统环境变量的,有系统属性的等,而Spring框架都兼容了这些配置,那么Spring是如何做来兼容这些配置的呢?答案就是通过来源(Source)来兼容,即将配置文件中的所有配置项封装进一个Properties对象中,然后使用一个Source源来标识,将系统环境变量所有配置项封装进一个Properties中然后使用一个Source源来标识;这样将不同的配置使用分类的方式来简化管理; - Spring中的Environment
对外部配置分类,方便了Spring框架对配置的管理和扩展,目前Spring框架配置来源分类多达十几种,如何对这些分类进行统一管理呢,答案就是Environment;Spring框架将所有来源的配置都放进了Environment对象中,通过它来管理所有的外部配置; - Environment功能
虽然我们都配置是多源的,但是配置的格式都是Key-Value的,在获取时不可能是遍历源然后去拿数据,所以Environment就帮我们做了这些操作,我们只需要告诉Environment我们需要什么配置就可以,不需要知道配置来自那里;这也是典型的门面模式;
2、Spring中的Profile 2.1、什么是Profile注意:JDK中的两种配置集合对Spring框架来说也是外部配置:Map
getenv = System.getenv()和Properties properties = System.getProperties();我们通过Environment获取配置时Spring会把从这两个对象中获取的配置返回给我们;
Spring容器中管理了我们定义的所有的Bean,而Profile可以理解为我们给这些Bean定义了一个逻辑分组,Spring可以根据这个逻辑分组来分类管理这些Bean;这个功能是Spring框架3.1时就提供的功能。目的是对Bean更细粒度的划分和管理;
2.2、Profile产生背景实际开发过程中,同一个项目需要有开发、测试、线上环境,不同的环境使用的配置是不一样的;还有在测试阶段使用了mock接口,上线后就不需要在使用mock接口了(这里的mock接口就是Bean)这些情况在没有Profile之前一直都需要手动修改配置文件或者写代码兼容,非常麻烦;于是Profile就应运而生,Profile不仅可以区分不同环境的配置文件,也可以对Bean进行逻辑分组,指定不同的Profile就可以加载不同的配置文件和分组下的Bean组件。
2.3、Profile的配置和使用通过@ActiveProfiles注解配置
通过spring.profiles.active来配置
通过来配置给Bean组件分组
- Properties接口主要处理key-value配置项
- 由于key-value可以实现数据类型转换以及EL表达式${}解析支持,所以Properties需要可以配置
- Environment继承了Properties接口有加入了Profile的的内容
- 由于Profile可以被设置或者以编程的方式激活,所以也需要可配置
- Environment分类概述
Spring根据Application的应用类型会创建不同的Environment,如果是Web应用则会创建基于ServletWeb的Environment,如果不是Web则会创建普通的Environment,还有一种是响应式(Reactive)调Web环境会创建对应的 Environment; - Environment区别
非web环境Environment
StandardEnvironment {activeProfiles=[], defaultProfiles=[default],
propertySources=[
ConfigurationPropertySourcesPropertySource {name='configurationProperties'},
SimpleCommandLinePropertySource {name='commandLineArgs'},
PropertiesPropertySource {name='systemProperties'},
OriginAwareSystemEnvironmentPropertySource {name='systemEnvironment'},
RandomValuePropertySource {name='random'},
OriginTrackedMapPropertySource {name='applicationConfig: [classpath:/application.yml]'},
ResourcePropertySource {name='class path resource [mode.properties]'},
ResourcePropertySource {name='class path resource [greeting.properties]'}]}
- 基于servlet的web环境
StandardServletEnvironment {activeProfiles=[], defaultProfiles=[default],
propertySources=[
ConfigurationPropertySourcesPropertySource {name='configurationProperties'},
SimpleCommandLinePropertySource {name='commandLineArgs'},
StubPropertySource {name='servletConfigInitParams'},
ServletContextPropertySource {name='servletContextInitParams'},
PropertiesPropertySource {name='systemProperties'},
OriginAwareSystemEnvironmentPropertySource {name='systemEnvironment'},
RandomValuePropertySource {name='random'},
OriginTrackedMapPropertySource {name='applicationConfig: [classpath:/application.yml]'},
ResourcePropertySource {name='class path resource [mode.properties]'},
ResourcePropertySource {name='class path resource [greeting.properties]'}]}
a、可以看到配置属性有多个来源,包括命令行参数,系统属性,系统环境,随机数,yml配置文件,properties配置文件等。
b、这些源在上面的顺序就是它们的优先级,可见命令行的最高,properties文件的最低。
c、以-D开头的参数会出现在系统属性这个源里
d、以–开头的参数会出现在命令行参数这个源里
e、二者的唯一区别就是多了两个和web相关的源,就是ServletConfig和ServletContext。
注意源中的第一个,即名称为configurationProperties的,主要是为了适应SpringBoot的属性名的“松散”绑定而专门用来处理属性名称的,它并不真正提供属性值,它的值来源于除它之外的其它源。
松散绑定:user-name, user_name, userName这三个属性名称都可以绑定到一个类的userName属性上。



