SpringBoot学习笔记(二)
配置文件分类
SpringBoot中4级配置文件
1级:file:config/application.yaml 【最高】
2级:file:application.yml
3级:classpath:config/application.yml
4级:classpath:application.yml 【最低】
总结:
1.项目文件分为4种:
- 项目类路径配置文件:服务于开发人员本机开发于测试
- 项目类路径config目录种配置文件:服务于项目经理整体调控
- 工程路径配置文件:服务于运维人员配置涉密线上环境
- 工程路径config目录中配置文件:服务于运行经理整体调控
2.多层级配置文件间的属性采用叠加并覆盖的形式作用于程序
自定义配置文件
通过启动参数加载配置文件(无需书写配置文件扩展名)
Edit Configrations->Configuration->Program arguments
--spring.config.name=ebank
通过启动参数加载指定文件路径下的配置文件时可以加载多个配置
Edit Configrations->Configuration->Program arguments
--spring.config.location=classpath:/ebank.properties,classpath:/ebank-server.properties
自定义配置文件-重要说明
- 单服务器项目:使用自定义配置文件需求较低
- 多服务器项目:使用自定义配置文件需求较高,将所有配置放置在一个目录中,统一管理
- 基于SpringCloud技术,所有的服务器将不再设置配置文件,而是通过配置中心进行设定,动态加载配置信息
小结:
1.配置文件可以修改名称,通过启动参数设定
2.配置文件可以修改路径,通过启动参数设定
3.微服务开发中配置文件通过配置中心进行设置
总结:
1.SpringBoot在开发和运行环境均支持临时参数修改工程配置
2.SpringBook支持4级配置文件,应用于开发与线上环境进行配置的灵活设置
3.SpringBoot支持使用自定义配置文件的形式修改配置文件存储位置
4.基于微服务开发时配置文件将使用配置中心进行管理
多环境开发(yaml版)
spring:profiles:active: pro---
spring:profiles: proserver:port: 80---
spring:profiles: devserver:port: 81
---
spring:profiles: testserver:port: 82
spring:profiles:active: pro---
server:port: 80spring: 过时格式profiles: pro
spring:profiles:active: pro---
server:port: 80spring: 推荐格式config:activate:on-profiles: pro
总结:
多环境开发需要设置若干种常用环境,例如开发、生产、测试环境
多环境开发多文件版(yaml版)
多环境开发(YAML版)多配置文件格式
1.主启动配置文件application.yml
spring:profiles:active: dev
2.环境分类配置文件application-pro.yml
server:port: 80
3.环境分类配置文件application-dev.yml
server:port: 81
4.环境分类配置文件application-test.yml
server:port: 82
多环境开发配置文件书写技巧(一)
- 主配置文件中设置公共配置(全局)
- 环境分类配置文件中常用于设置冲突属性(局部)
多环境开发多文件版(properties版)
多坏境开发(Properties版)多配置文件格式
主启动配置文件application.properties
spring.profiles.active=pro
环境分类配置文件application-pro.properties
spring.port=80
环境分类配置文件application-dev.properties
spring.port=81
环境分类配置文件application-test.properties
spring.port=82
总结:
properties文件多环境配置仅支持多文件格式
多环境分组管理
多环境开发独立配置文件书写技巧(二)
根据功能对配置文件中的信息进行拆分,并制作成独立的配置文件,命名规则如下:
- application-devDB.yml
- application-devRedis.yml
- application-devMVC.yml
使用include属性再激活指定环境的情况下,同时对多个环境进行加载使其生效,多个环境间使用逗号分隔
spring:profiles:active: devinclude: devDB,devRedis,devMVC
配置文件加载顺序:devDB,devRedis,devMVC,dev 后面的配置文件覆盖前面的配置文件
注意事项
当主环境dev与其他环境有相同属性时,主环境属性生效;其他环境中有相同属性时,最后加载的环境属性生效
从SpringBoot2.4版开始使用group属性替代include属性,降低了配置书写量
使用group属性定义多种主环境与子环境的包含关系
spring:profiles:active: devgroup:"dev": devDB,devRedis,devMVC"pro": proDB,proRedis,proMVC"test": testDB,testRedis,testMVC
配置文件加载顺序:devDB,devRedis,devMVC
总结:
多环境开发使用froup属性设置配置文件分组,便于线上维护管理
多环境开发控制
Maven与SpringBoot多环境兼容
1.maven中设置多环境属性
<profiles><profile><id>dev_env</id><properties><profile.active>dev</profile.active></properties><activation><activeByDefault>true</activeByDefault></activation></profile><profile><id>pro_env</id><properties><profile.active>pro</profile.active></properties></profile><profile><id>test_env</id><properties><profile.active>pro</profile.active></properties></profile>
</profiles>
2.SpringBoot中引用Maven属性
spring:profiles:active: @profile.active@"dev": devDB,devMVC"pro": proDB,proMVC
3.执行Maven打包指令,并在生产的boot打包文件.jar文件中查看对应信息
总结:
1.当Maven与SpringBoot同时对多环境进行控制时,以Maven为主,SpringBoot使用@…@占位符读取Maven对应的配置属性值
2.基于SpringBoot读取Maven配置属性的前提下,如果在Idea下测试工程时pom.xml每次更新需要手动compile方可生效
日志
日志基础
步骤:代码中使用日志工具记录日志
1.Maven设置多环境属性
@RestController
@RequestMapping("/books")
public class BookController extends BaseController {private static final Logger log = LoggerFactory.getLogger(BookController.class);@GetMappingpublic String getById(){System.out.println("springboot is running...");log.debug("debug...");log.info("info...");log.warn("warn...");log.error("error...");return "springboot is running...";}
}
2.设置日志输出级别
# 开启debug模式,输出调试信息,常用于检查系统运行状况
debug: true# 设置日志级别,root表示根节点,即整体应用日志级别
logging:level:root: debug
3.设置日志组,控制指定包对应的日志输出级别,也可以直接控制指定包对应的日志输出级别
logging:# 设置日志组group:# 自定义组名,设置当前组中所包含的包ebank: com.luxifa.controllerlevel:root: warn# 为对应组设置日志级别ebank: debug# 为对应包设置日志级别com.luxifa.controller: debug
总结:
1.日志用于记录开发调试与运维过程消息
2.日志的级别共6种,通常使用4种即可,分别是DEBUG,INFO,WARN,ERROR
3.可以通过日志组或代码包的形式进行日志显示级别的控制
快速创建日志对象
使用lombok提供的注解@Slf4j简化开发,减少日志对象的声明操作
@Slf4j
@RestController
@RequestMapping("/books")
public class BookController {@GetMappingpublic String getById() {System.out.println("springboot is running...");log.debug("debug info...");log.info("info info...");log.warn("warn info...");log.error("error info...");return "springboot id running...";}
}
总结:
基于lombok提供的@Slf4j注解为类快速添加日志对象
日志输出格式控制
2023-02-20 16:39:40.334 INFO 2336 --- [ main] com.luxifa.SpringbootLogApplication Started SpringbootLogApplication in 1.281 seconds(JVM...)
2023-02-20 16:39:40.334 : 时间
INFO:级别
2336:PID 进程ID,用于表明当前操作所处的进程,当多服务同时记录日志时,该值可用于协助程序员调试程序
main:所属线程
com.luxifa.SpringbootLogApplication:所属类/接口名 当前显示信息为SpringBoot重写后的信息,名称过长时,简化包名书写为首字母,甚至直接删除
Started SpringbootLogApplication in 1.281 seconds(JVM…):日志信息
设置日志输出格式
logging:pattern:console: "%d - %m%n"
- %d”: 日期
- %m:消息
- %n:换行
logging:pattern:console: "%d %clr(%p) --- [%16t] %clr(%-40.40c){cyan} : %m %n"
总结:
日志输出格式设置规则
日志文件
文件记录日志(运维实用)
设置日志文件
logging:file:name: server.log
日志文件详细配置
loging:file:name: server.loglogback:rollingpolicy:max-file-size: 3KBfile-name-pattern: server.%d{yyyy-MM-dd}.%i.log
总结:
1.日志记录到文件
2.日志文件格式配置
热部署
手动启动热部署
开启开发者工具
<denpendency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><optional>true</optional>
</denpendency>
激活热部署:Ctrl+F9 或者 Build->Build Project
关于热部署
- 重启(Restart):自定义开发代码,包含类、页面、配置文件等,加载位置restart类加载器
- 重载(Reload):jar包,加载位置base类加载器
总结:
1.开启开发者工具后启用热部署
2.使用构建项目操作启动热部署(Ctrl+F9)
3.热部署仅仅加载当前开发者自定义开发的资源,不加载jar资源
自动启动热部署
步骤:
1.setting->Build,Excution,Deployment->Compiler->Build project automaticaly 勾选
2.Ctrl+Alt+Shift+/ 快捷键 然后在弹出的页面中 Registry->compiler.automake.allow.when.app.running 勾选
激活方式:Idea失去焦点5秒后启动热部署
热部署范围配置
默认不触发重启的目录列表
- /META-INF/maven
- /META-INF/reesources
- resources
- static
- public
- templates
自定义不参与重启排除项
devtools:restart:# 设置不参与热部署的文件或文件夹excude: public/**,static/**
关闭热部署
方式一:
devtools:restart:# 设置不参与热部署的文件或文件夹excude: public/**,static/**,config/application.ymlenbled:false
方式二:
设置高优先级属性禁用热部署
public static void main(String[] args) {System.setProperty("spring.devtools.restart.enabled","false");SpringApplication.run(SSMPAllication.class);
}
配置高级
@Confiturationproperties
使用@ConfigurationProperties为第三方绑定属性
application.yml中:
datasource:driverClassName: com.mysql.jdbc.Driver123
主程序:
@SpringBootApplication
public class SpringbootConfigurationApplication {@Bean@ConfigurationProperties(prefix = "datasource")public DruidDataSource datasource(){DruidDataSource ds = new DruidDataSource();return ds;}public static void main(String[] args) {ConfiguravleApplicationContext ctx = SpringApplication.run(SpringbootConfigurationApplication.class,args);DruidDataSource ds = ctx.getBean(DruidDataSource.class);System.out.println(ds);}
}
控制台:
com.mysql.jdbc.Driver123
@EnableConfigurationProperties注解可以将使用@ConfigurationProperties注解对应的类加入Spring容器
application.yml中:
servers:ipAddress: 192.168.0.1port: 2848timeout: -1
//Component
@Data
@ConfigurationProperties(prefix = "servers")
public class ServerConfig {private String ipAddress;private int port;private long timeout;
}
@SpringBootApplication
@EnableConfigurationProperties(ServerConfig.class)
public class DemoApplication {public static void main(String[] args) {ConfigurableApplicationContext ctx = SpringApplication.run(SpringbootApplication.class,args);}}
注意事项:
@EnableConfigurationProperties与@Component不能同时使用
解除使用@ConfigurationProperties注释警告
Spring Boot Configuration Annotation Processor not configuref Open Docementation...
pom.xml中添加如下依赖:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId>
</dependency>
宽松绑定/松散绑定
@ConfigurationProperties绑定属性支持属性名宽松绑定
不管是驼峰模式、下划线模式、中划线模式、常量模式都能绑定
驼峰模式:
servers:ipAddress: 192.168.1.1port: 2345timeout: -1
下划线模式:
servers:ip_address: 192.168.1.1port: 2345timeout: -1
中划线模式:
servers:ip-address: 192.168.1.1port: 2345timeout: -1
常量模式:
servers:IP_ADDRESS: 192.168.1.1port: 2345timeout: -1
//Component
@Data
@ConfigurationProperties(prefix = "servers")
public class ServerConfig {private String ipAddress;private int port;private long timeout;
}
@SpringBootApplication
@EnableConfigurationProperties(ServerConfig.class)
public class SpringbootConfiurationApplication {public static void main(String[] args) {SpringApplication.run(SpringbootConfigurationApplication.class,args);}
}
注意事项:
宽松绑定不支持注解@Value引用单个属性的方式
@ConfigurationProperties(prefix = “servers”) 绑定前缀命名规范:仅能使用纯小写字母、数字、下划线作为合法的字符
总结:
1.@ConfigurationProperties绑定属性支持属性名宽松绑定
2.@value注解不支持松散绑定
3.绑定前缀命名规则
常用计量单位绑定
常用计量单位
SpringBoot支持JDK8提供的时间与空间计量单位
servers:ipAddress: 192.168.0.2port: 2345timeout: -1serverTimeOut: 3dataSize: 10
@Component
@Data
@ConfigurationProperties(prefix = "servers")
public class ServerConfig {private String ipAddress;private int port;private long timeout;@DurationUnit(ChronoUnit.MINUTES)private Duration serverTimeOut;@DataSizeUnit(DataUnit.MEGABYTES)private DataSize dataSize;
}
数据校验
bean属性校验
步骤:开启Bean数据校验
servers:ipAddress: 192.168.0.2port: 2345timeout: -1
1.添加JSR303规范坐标与Hibernate校验框架对应坐标
<dependency><groupId>javax.validation</groupId><artifactId>validation-api</artifactId>
</dependency><dependency><groupId>org.hibernate.validator</groupId><artifactId>hibernate-validator</artifactId>
</dependency>
2.对Bean开启校验功能
@Component
@Data
@ConfigurationProperties(prefix = "servers")
@Validated
public class ServerConfig {private String ipAddress;private int port;private long timeout;
}
3.设置校验规则
@Component
@Data
@ConfigurationProperties(prefix = "servers")
@Validated
public class ServerConfig {@Max(value = 400,message = "最大值不能超过400")private String ipAddress;private int port;private long timeout;
}
总结:
启动Bean属性校验
- 导入JSR303与Hibernate校验框架坐标
- 使用@Validated注解启动校验功能
- 使用具体校验规则范数据校验格式