2026/5/19 9:32:55
网站建设
项目流程
个人房产信息查询网站,海珠建网站多少钱,创意网站设计团队,内部劵网站怎么做SpringBoot使用一个全局配置文件#xff0c;配置文件名固定#xff1a; application.propertiesapplication.yml application.properties端口设置8081#xff0c;application.yml端口设置8082#xff0c;运行启动类#xff0c;优先走8081。 两个配置文件互补#xff0c;a…SpringBoot使用一个全局配置文件配置文件名固定application.propertiesapplication.ymlapplication.properties端口设置8081application.yml端口设置8082运行启动类优先走8081。两个配置文件互补application.properties优先级 application.yml优先级。目录配置文件格式配置文件值注入1. 注入值2. 松散绑定3. SpEL4. JSR303 数据校验5. 复杂类型封装PropertySourceImportResourceBeanPropertySourceImportResourceBean配置文件占位符多Profile文件在配置文件中指定运行环境编辑在外部指定运行环境配置文件加载位置外部配置加载顺序配置文件格式YML配置格式k:(空格)v表示一对键值对空格必须有字符串默认不用加上单引号或者双引号双引号不会转义字符串里面的特殊字符特殊字符会作为本身想表示的意思例子name: zhangsan \n lisi输出zhangsan换行lisi单引号会转义特殊字符特殊字符最终只是一个普通的字符串数据例子name: ‘zhangsan \n lisi’输出zhangsan \n lisi以空格的缩进来控制层级关系只要是左对齐的一列数据都是同一个层级的属性和值也是大小写敏感server: port: 8085properties配置格式server.port8084配置文件值注入配置文件中无论是yml还是properties他们都能获取到值。在实体类上使用ConfigurationProperties进行值注入。ConfigurationProperties告诉SpringBoot将本类中的所有属性和配置文件中相关配置进行绑定默认从全局配置文件中获取值。prefix person配置文件中哪个与本类中的属性进行一一映射1. 注入值前期准备创建实体类person类简单属性id、name、personname、address、boss、birth、复杂类型lsit类型、map类型、dog对象、dog对象列表dog类id、namepublic class Person { private Integer id; private String name; private String address; private Boolean boss; private Date birth; private String personName; private ListString hobby; private MapString,Object maps; private Dog dog; // 嵌套对象 private ListDog dogs; // dog对象列表 // 提供无参构造、有参构造、Getter和setter对象以及重新toString } public class Dog { private String name; private Integer age; // 提供无参构造、有参构造、Getter和setter对象以及重新toString }将实体类交由spring管理在实体类上加上Component注解书写配置文件在application.yml配置文件中写person的属性值简单属性person: # 普通属性 id: 1 name: zhangsan \n lisi address: 北京 boss: true birth: 2025/1/18list集合# list集合书写 # 方式一 # lists: {篮球足球} # 方式二 lists: - 篮球 - 足球 - 乒乓球map集合# map集合书写 maps: {sex: male,email: 123456789qq.com}dog属性# dog属性 dog: name: 小狗 age: 2dog列表属性# dog对象list集合 # 方式一行内列表格式 # dogs: # - name: 小黑 # age: 3 # - name: 小黄 # age: 2 # - {name: 金毛,age: 1} # 方式二块式列表格式 dogs: - name: 小黑 age: 3 - name: 小黄 age: 2 - name: 金毛 age: 1松散绑定# 松散绑定下面的方式都可以实现 # personName: wangwu # person_name: wangwu # person-name: wangwu PERSONNAME: wangwu绑定值Value需要对属性一个一个的进行注入只能为简单属性进行注入复杂类型不支持。在使用Value注解注入值时并不强制要求属性提供setter方法。Spring框架可以通过反射直接设置字段的值即使没有setter方法。但是如果类中的属性是私有的并且没有setter方法Spring会通过反射来设置值。然而在实际开发中为了符合JavaBean的规范以及方便其他代码如序列化、其他框架使用使用通常我们会提供getter和setter方法。另外需要注意的是如果使用Value注解在非Spring管理的类中或者在没有Spring容器管理的环境下那么注解将不会生效。因此确保这个类是由Spring容器管理的如使用Component、Service等注解或者通过XML配置。由于复杂类型没有注入值值为null。//使用Value注值 Component //交给spring管理 public class Person { Value(${person.id}) private Integer id; Value(${person.name}) private String name; Value(${person.address}) private String address; Value(${person.boss}) private Boolean boss; Value(${person.birth}) private Date birth; private String personName; private ListString lists; private MapString,Object maps; private Dog dog; // 嵌套对象 private ListDog dogs; }ConfigurationProperties可以批量给属性注值且复杂类型也可以进行注值使用ConfigurationProperties注解进行属性绑定时必须提供 setter 方法因为 Spring 是通过调用 setter 方法来注入属性的。同样如果需要访问这些属性也需要 getter 方法。原因ConfigurationProperties 绑定属性时使用的是 JavaBean 的规范即通过 setter 方法设置值。如果没有 setter 方法Spring 将无法将属性值设置到对应的字段上。但是请注意1. 如果使用 Lombok 的 Data 注解它会自动生成 getter 和 setter这样就可以。2. 如果属性是 final 的那么必须通过构造函数来注入这时候就不能用 setter 了。但是 ConfigurationProperties 默认要求有无参构造函数和 setter所以对于 final 字段我们需要提供构造函数并且使用 ConstructorBinding 注解在 Spring Boot 2.2 以后引入。//方式二使用注解 Component //交给spring管理 ConfigurationProperties(prefix person) public class Person { private Integer id; private String name; private String address; private Boolean boss; private Date birth; private String personName; private ListString lists; private MapString,Object maps; private Dog dog; // 嵌套对象 private ListDog dogs; }2. 松散绑定就是 personName 字段在配置文件中以多种形式书写都可以绑定值。ConfigurationProperties 支持Value 不支持3. SpELValue 配合 SpE不仅可以绑定简单属性还能处理非常复杂的表达式和对象操作。ConfigurationProperties 不支持Value 支持a. 配置文件内容# SpEL 表达式 personDemo: id: 1 name: zhangsan address: 北京 boss: trueb. PersonDemo实体类// 复杂 SpEL 表达式 Component public class PersonDemo { Value(${personDemo.name}) private String name; // 数学运算计算结果为 15 Value(#{10 5}) private Integer rendomNumber; // 将配置的值转为大写 Value(#{${personDemo.name}.toUpperCase()}) private String uppercaseName; // 调用静态方法生成 0-100 的随机数 Value(#{T(java.lang.Math).random() * 100}) private Double randomScore; // 三元运算符条件表达式 Value(#{${personDemo.id} 0 ? active : inactive}) private String status; Value(#{${personDemo.boss} ? 领导 : 员工}) private String role; // 正则表达式匹配 Value(#{personDemo.name matches [a-zA-Z]}) private Boolean isNameValid; // 列表操作 Value(#{{apple, banana, orange}}) private ListString fruits; }4. JSR303 数据校验ConfigurationProperties 支持Value 不支持a. 配置文件内容# JSR303 数据校验 user-demo: id: 2 name: lisi email: 123456789qq.com phone: 13345678910 accepted: true birth: 2026/2/20b. User实体类Component ConfigurationProperties(prefix user-demo) Validated // 启用校验 JSR303 数据校验 public class UserDeno { NotNull(message ID不能为空) Min(value 1, message ID必须大于0) Max(value 10, message ID不能超过10) private Integer id; NotBlank(message 姓名不能为空) Size(min 2, max 10, message 姓名长度必须在2-10之间) private String name; Email(message 邮箱格式不正确) private String email; Pattern(regexp ^1[3-9]\\d{9}$, message 手机号格式不正确) private String phone; AssertTrue(message 必须接收协议) private Boolean accepted; Future(message 生日必须是将来时间) private Date birth; }5. 复杂类型封装在person中的dog对象等属性的封装ConfigurationProperties 支持Value 不支持Value获取值和ConfigurationProperties获取值比较PropertySourceImportResourceBeanPropertySourcePropertySource加载指定的配置文件1. 新建一个application-dev.properties配置文件user-demo.id2 user-demo.name李四 user-demo.email3025147478qq.com user-demo.phone15032722309 user-demo.acceptedtrue user-demo.birth2026/2/202. 在UserDemo实体类上添加PropertySource 注解指定配置文件// PropertySource指定加载配置文件 PropertySource(value {classpath:application-dev.properties}) Component ConfigurationProperties(prefix user-demo) Validated // 启用校验 JSR303 数据校验 public class UserDemo { NotNull(message ID不能为空) Min(value 1, message ID必须大于0) Max(value 10, message ID不能超过10) private Integer id; NotBlank(message 姓名不能为空) Size(min 2, max 10, message 姓名长度必须在2-10之间) private String name; Email(message 邮箱格式不正确) private String email; Pattern(regexp ^1[3-9]\\d{9}$, message 手机号格式不正确) private String phone; AssertTrue(message 必须接收协议) private Boolean accepted; Future(message 生日必须是将来时间) private Date birth; }ImportResourceImportResource导入Spring的配置文件让配置文件里面的内容生效Spring Boot里面没有Spring的配置文件我们自己编写的配置文件也不能自动识别想让Spring的配置文件生效加载进来在启动类上加ImportResource 注解1. 在service包下创建 HelloService.javapublic interface HelloService { public void hello(); }2. 在service.impl下创建HelloServiceImpl.javapublic class HelloServiceImpl implements HelloService { Override public void hello() { System.out.println(你好); } }3. 创建Spring配置文件applicationContext.xml?xml version1.0 encodingUTF-8? beans xmlnshttp://www.springframework.org/schema/beans xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd bean idhelloService classcom.qcby.springBootDemoYml.service.impl.HelloServiceImpl/ /beans4. 在启动类上添加ImportResource 注解SpringBootApplication // 导入spring的配置类让其生效 ImportResource(locations {classpath:applicationContext.xml}) public class SpringBootDemoYml { public static void main(String[] args) { SpringApplication.run(SpringBootDemoYml.class, args); } }5. 控制台输出你好Bean添加Bean注解后不在需要 applicationContext.xml 配置文件了且不需要使用ImportResource 注解。1. 创建WordService.javapublic interface WordService { public void helloWord(); }2. 创建WordServiceImpl.javapublic class WordServiceImpl implements WordService { Override public void helloWord() { System.out.println(你好世界); } }3. 创建WordConfig.javaConfiguration // 声明当前是配置类 public class WordConfig { Bean // 只能声明在方法上 public WordService wordServiceBean(){ System.out.println(wordConfig配置类); return new WordServiceImpl(); } }4. 控制台输出wordConfig配置类 你好世界配置文件占位符占位符使用${}形式。随机数${random.value}、${random.int}、${random.long} ${random.int(10)}、${random.int(0,100)}创建Parent实体类并绑定值Component ConfigurationProperties(prefix parent) public class Parent { private Integer id; private String name; private Integer age; private Date birth; private Boolean boss; private MapString, Object maps; private ListString lists; private Dog dog; // 提供无参构造、有参构造、Getter和setter对象以及重新toString }在application.yml配置文件中写属性值# 配置文件占位符 parent: id: ${random.int} name: zhaoliu \n ${random.uuid} age: 20 birth: 2028/12/12 boss: true maps: {email: 3025147478qq.com, phone: 11111} lists: - 花花 - 草草 dog: name: ${parent.name:wangwu}小黄 # 若没有配置parent下的name属性值默认使用wangwu若配置类值则使用配置的值 age: ${random.int(3,5)} # 生成0到5之间的随机整数多Profile文件外部指令优先级 配置文件在配置文件中指定运行环境有两种多配置文件形式propertiesapplication-{profile}.properties在主配置文件application.properties中指定运行环境# 多配置文件 spring.profiles.activedevyml在application.yml中配置多个端口# 多配置文件 server: port: 8085 spring: profiles: active: dev --- server: port: 8084 spring: profiles: dev --- server: port: 8086 spring: profiles: prod # 指定属于那个环境在外部指定运行环境# java -jar 打包的项目名.jar --spring.profiles.active环境名称 java -jar springbootdemoyml-1.0-SNAPSHOT.jar --spring.profiles.activeprod配置文件加载位置springboot启动会扫描一下位置的application.properties或者application.yml文件作为Spring boot的默认配置文件SpringBoot会从这四个位置全部加载主配置文件互补配置–file:./config/–file:./–classpath:/config/–classpath:/如果项目中存在这四个位置下的配置文件加载顺序为-file:./config/ -file:./ -classpath:/config/ -classpath:/外部配置加载顺序命令行参数多个配置用空格分开 --配置项值在D:\code2024\application.properties放在一个配置文件端口号8083在外部命令行中运行这个环境# java -jar 打包的项目名.jar --spring.config.location外部位置\application.properties java -jar springbootdemoyml-1.0-SNAPSHOT.jar --spring.config.locationD:\code2024\application.properties在命令行中指定端口和路径注意在Spring Boot 2.x 之后不在使用--server.context-path 这个命令而是使用--server.servlet.context-path。# java -jar 打包的项目名.jar --server.port端口号 --server.servlet.context-path路径 java -jar springbootdemoyml-1.0-SNAPSHOT.jar --server.port8087 --server.servlet.context-path/abc