目录
2. spring.config.additional-location
1. spring.config.active
1.1加载顺序:springboot启动的时候会扫描application.properties/yml文件作为spring boot的默认配置文件。按照优先级从高到低的顺序,所有位置的文件都会被加载,高优先级配置内容会覆盖低优先级配置的内容,并形成互补配置.
- file: 指当前项目根目录
- classpath: 指当前项目的resources目录
file:./config/
file:./
classpath:/config/
classpath:/
注意:maven打包是不能把src外面的两个application.properties文件打到jar包里的。
1.2 使用
根据不同的开发时期选择不同的额外配置,和默认的application.yml properties形成互补
方式1: 写到配置文件里面
方式2:部署的时候配置
java -jar renren-gdrc.jar --spring.profiles.active=stress
2. spring.config.location
# D:\my-application.yml 外置配置文件位置
java -jar renren-gdrc.jar --spring.config.location = D:\my-application.yml
这样外置的配置文件会覆盖jar包里面的配置文件
3. spring.config.additional-location
java -jar renren-gdrc.jar --spring.config.additional-location = D:\my-application.yml
这样外置配置文件会和jar包里面的配置文件互补
外置配置 my-application.yml 连接数据库的配置给单独拿出来了。
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource # 数据源类型
druid: #定义数据库连接池所需要相关配置
initial-size: 5 # 初始化连接池大小
min-idle: 10 # 最小维持连接池大小
max-active: 50 # 最大可提供的连接数量
max-wait: 60000 # 最长等待时间(50个连接都在被使用,最长等待的时间)
# 避免db 单方面关闭连接,mysql::show variables like %timeout%
#关注interactive_timeout和wait_timeout,(mysql服务器断开不执行操作客户端时间)默认8h,对于mysql的8h问题:
# 1.minEvictableIdLeTimeMillis < maxEvictableIdleTimeMillis
# 2.maxEvictableIdleTimeMillis + timeBetweenEvictionRunsMillis < 8h
#(最大空闲时间加上 检测时间 小于 服务器断开不执行操作客户端时间。防止数据库会断开这个连接,但是应用不知道这个连接已经被数据库断开,所以链接池认为该连接是有效的,在下次请求时,连接池会把自己认为有效,但是数据库认为无效的连接分配出去,便会报错。)
# 连接保持空闲而不被驱逐的最小时间,默认30分钟: 连接被destroy线程关闭条件:连接数> minIdle && 空闲时间 > 1800000
min-evictable-idle-time-millis: 1800000 # 连接最小生存时间
# 连接保持空闲而不被驱逐的最大时间,默认7h。连接被destroy线程关闭条件: 空闲时间>2520000,不管池中连接数是否>minIdle
max-evictable-idle-time-millis: 25200000
validation-query: select 1 from dual # 数据库状态的检测
validation-query-timeout: 60000 # 设置验证查询的超时时间,单位是毫秒。
# 单位:ms 默认1 min ,作用两个
# 1.Destroy线程运行周期,见min-evictable-idle-time-millis和max-evictable-idle-time-millis
# 2.test-while-idle使用,申请连接时,若空闲时间>60000 则执行validation-query 检测连接是否有效
time-between-eviction-runs-millis: 60000 # 关闭空闲连接间隔 毫秒
test-while-idle: true # 申请连接时检测空闲时间,根据空闲时间再检测连接是否有效 使用validation-query # 使用validationQuery,你用类似testonBorrow,但是因为有执行条件限制,所以对性能影响 #作为连接检测的兜底方案
test-on-borrow: false # 申请连接时直接检测连接是否有效 影响性能 拿到连接去 数据库执行 select 1
test-on-return: false # 返回连接前是否需要进行测试 影响性能
pool-prepared-statements: false # 不缓存PSTHMT oracal 可这么干其他不用
dynamic:
primary: master
datasource:
zk:
url: jdbc:mysql://localhost:3306/zk?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&useSSL=false&allowPublicKeyRetrieval=true
username: root
password: root
4. yml 中mysql密码加密
username: root
password: ENC(sLwAb9X+OHray3HpbGW83w==)
相信看到这里会发现密码进行了加密
Jasypt 是一个Java简易加密库,用于加密配置文件中的敏感信息,如数据库密码。jasypt库与springboot集成,在实际开发中非常方便。
依赖
<!--jasypt配置加密-->
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>2.1.2</version>
</dependency>
代码
String input = scanner.next();
BasicTextEncryptor textEncryptor = new BasicTextEncryptor();
textEncryptor.setPassword("abcdef"); // 用您自己的密钥替换"yourSecretKey"
String encryptedString = textEncryptor.encrypt(input);
String decrypt = textEncryptor.decrypt(encryptedString);
System.out.println("加密后的字符串为: " + encryptedString);
System.out.println("解密后的字符串为: " + decrypt);
配置文件里面就可以放入加密后的字符串 用 ENC() 包裹
秘钥配置需要和加密的秘钥一致:
- 方式1: 配置文件里面直接加上
- 方式2:项目打包部署直接写到命令里面
java -jar -Djasypt.encryptor.password=abcdef renren-gdrc.jar
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
dynamic:
primary: master
datasource:
master:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://xxxx:3306/customer_gdrc?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true&useSSL=false
username: cm
password: ENC(/SvYhN/CL3MiDXlTH5WSmw==)
# 加密的秘钥
jasypt:
encryptor:
password: abcdef
5. 补充:外部jar打包进项目
参考:SpringBoot项目如何引入外部jar及将外部jar打包到项目发布jar包
pom 依赖
<dependency>
<groupId>com.aisec.iam</groupId>
<artifactId>iamsdk.base.util</artifactId>
<version>1.0.0</version>
<!--
scope=system表示此依赖是来自外部jar,而不是maven仓库
注意:
只有当scope设置为system时,systemPath属性才会生效
systemPath是一个物理文件路径,来指定依赖的外部jar在物理磁盘的位置
${project.basedir}代表项目根目录
-->
<scope>system</scope>
<systemPath>${project.basedir}/lib/iam-sdk-1.0.0.jar</systemPath>
</dependency>
将外部jar包打包到当前项目jar包中
pom 增加内容
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
<!-- 在打包时将引用的外部jar引入到当前项目包中 -->
<includeSystemScope>true</includeSystemScope>
</configuration>
</plugin>
</plugins>
</build>
<resources>
<resource>
<!-- directory 表示取该目录下的文件 -->
<directory>lib</directory>
<!--targetPath 指定打包到哪个目录下 默认是放到class目录下-->
<targetPath>/BOOT-INF/lib/</targetPath>
<!-- 取符合格式的所有文件 *代表全部 -->
<includes>
<include>**/*.jar</include>
</includes>
</resource>
</resources>
</build>
这样再打包 外部的jar就会被一同打入到jar包中了