起步依赖原理分析
在 spring-boot-starter-parent 里定义了各种技术的版本信息,组合了一套最优的技术版本搭配;
在各种starter中,定义类完成改功能需要的坐标合计,其中大部分信息都来自父工程
【注】按住Ctrl键再鼠标左键点击spring-boot-starter-parent可以打开该文档,这就是父类的文档
工程文件在继承parent,引入starter之后,通过依赖传递,就可以简单方便地获得需要的jar包,并且不会存在版本冲突问题。
自定义SpringApplication
官网提供了一个这样的实例,用于关闭启动时的横幅。
配置文件
配置文件分类
默认配置文件名称:application
- application.properties
使用键值对的格式
server.port = 8080
- application.yml(application.yaml)
server:
port: 8080
注意:冒号和8080之间有一个空格
加载顺序
如果三种配置文件都有,那么properties的优先级最高,其次是yml,最后是yaml。
yaml
全称是YAML Ain't Markup Language。是一种直观地能被电脑识别的数据序列化格式,并且容易被人阅读,容易和脚本语言交互。YAML文件是以数据为核心的,比传统的XML更加简洁。
YAML的扩展名可以是.yml或.yaml。
基本语法
- 大小写敏感
- 数据值之前必须有空格,空格数目大于0
- 使用缩进表示层级关系
- 缩进时不能用Tab键,只允许使用空格(各个操作系统Tab对应的空格数目不同,导致层次混乱)
- 相同层级的元素左对齐
- #表示注释,从这个字符直到行尾都会被解析器省略
- server的冒号后面有没有空格无所谓
数据格式
1. 对象map:键值对
person:
name: zhangsan
#行内写法
person: {name: zhangsan}
2. 数组:一组按次序排列的值
address:
-beijing
-shanghai
#行内写法
address: [beijing,zhanghai]
3. 纯量:单个的,不可再分的值
msg1: 'hello \n world' # 单引号忽略转义字符
msg2: "hello \n world" # 双引号识别转义字符
参数引用
${key}
name: lisi
person:
name: ${name}
读取配置文件内容
- @Value
- Environment
- @ConfigurationProperties
- @PropertiesSource("classpath:data/user.properties"),这是引入外部配置文件,且不能是YAML文件,而且写的时候要注意格式,使用行内写法,冒号要换成等号。
@Component 把注解的属性加入到Spring容器(组件)中
@Value("${user.name}") 通过SpEL表达式绑定
@ConfigurationProperties(prefix="user") 通过指定配置文件中的某一个节点,自动和属性进行绑定,在指定时属性名称不一定要完全一致,即支持松散绑定。不支持SPEL表达式,但是可以使用占位符。举例如下:
-------------------------------------------------------------------------------------
address:
id : 1
desc : ${user.name} //这个不是SPEL表达式,而是对其他属性的引用
username: ${radom.value}
age: ${radom.int}
或者age: ${radom.int(2)} 2是位数
或者age: ${radom.int[1,100]} 表示范围
--------------------------------------------------------------------------------------
@Validated 用于数据校验 例如@Notnull 就是校验数据非空
解决中文乱码:setting——file encoding —— UTF-8
自动提示:可以在官网上查到依赖,加上以后在配置文件里编写时就能看到提示。
profile
在开发SpringBoot应用时,通常一套程序会被安装到不同的环境,比如:开发、测试、生产,其中数据库地址、服务器端口等配置都不同,如果每次打包都要修改配置文件则非常麻烦。
profile就是来进行动态配置切换的。
配置方式
- 多profile文件方式
- YML多文档方式
激活方式
- 配置文件
- 虚拟机参数
- 命令行参数
代码演示
1. 多profile文件方式
先利用快速创建SpringBoot项目的方式搭建起来(具体方式在上一篇里)
在resources文件夹里新建下面的三个文档
之后直接运行查看结果
可以看到端口号是8080,并且第二行提示没有激活profile设置
接下来在application.properties里添加激活
再次运行查看结果
这次的端口号变为8081,并且第二行提示已经激活dev
2. 新建application.yml文件
三个横杠表示分割
再次运行查看结果
上面的激活都是在配置文件里面,下面介绍其他方式
在这个下选择Edit Configurations
在VM options里写,表示虚拟机配置
-Dspring.profiles.active=test
虚拟机成功覆盖
使用命令行,在里找到program arguments
在里面写
--spring.profiles.active=pro
最终效果如下图所示
注意运行时先把刚刚写过的虚拟机命令删除
打包JAR
点击package进行打包
我在打包时出现了这样的错误:SpringBoot打包失败:Please refer to XXX\target\surefire-reports for the individual test results.
可以在pom.xml文件里添加
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<testFailureIgnore>true</testFailureIgnore>
</configuration>
</plugin>
再次打包即可
有SUCCESS提示证明打包成功
在此目录下可以看到打包好的jar包
按住shift键点右键,打开powershell,输入
java -jar .\springboot-profiles-0.0.1-SNAPSHOT.jar
回车查看
也可以直接指定外部参数
java -jar .\springboot-profiles-0.0.1-SNAPSHOT.jar --spring profiles.active=dev
内部配置加载顺序
SpringBoot程序启动时,会从以下位置加载配置文件:
- file:./config/ :当前项目下的/config目录下
- file:./ :当前项目下的根目录
- classpath:/config/ :classpath的/config目录
- classpath:/ :classpath的根目录
加载顺序就是上述顺序,高优先级配置的属性会生效。