Spring Boot学习笔记(二)Spring Boot配置

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_34609889/article/details/86565783

一、配置文件

SpringBoot使用一个全局的配置文件,放在src/main/resources目录或者类路径/config下,配置文件名是固定的:

  • application.properties
  • application.yaml

Spring Boot配置文件的作用是用来修改SpringBoot自动配置的默认值。Spring Boot在底层都为我们自动配置好了默认的配置,如果需要改变就在配置文件中修改。

二、yml/yaml配置文件语法

简介:
.yml是YAML(YAML Ain’t Markup Language)语言的文件,以数据为中心,比json、xml等更适合做配置文件。
基本语法:

  • 使用缩进表示层级关系
  • 缩进时不允许使用Tab键,只允许使用空格
  • 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
  • 大小写敏感
  • 使用 - - - 习成文档块

写法:k:(空格)值v:(空格)值 ,表示一对键值对(空格必须有);
示例:

server:
    port: 8180
    path: /Test

值的数据类型:
(1)对象、map
对象的一组键值对,使用冒号分隔,注意空格。如:username: admin。示例:

person:
   name: zhangsan
   age: 19

行内写法:

person: {name: zhangsan,age: 18}

(2)数组
用”-(空格)值“表示数组中的一个元素

animals:
  - cat
  - dog
  - pig

行内写法:

animals: [cat,dog,pig]

(3)字面量
可以为数字、字符串、布尔、日期。其中字符串默认不使用引号;可以使用单引号或者双引号,单引号会转义特殊字符;字符串可以写成多行,从第二行开始,必须有一个单空格缩进。换行符会被转为空格。

三、将配置文件的值注入到程序中:

使用@ConfigurationProperties注解方式:

1、写好配置

student:
   name: 张三
   age: 18
   first: false
   birth: 2000/01/01
   score: {math: 90,chinese: 89,english: 88}
   teachers: 
     - 王五
     - 赵六
     - 李四
   dog:
     name: 旺财
     age: 2

也可以在application.properties文件中写但是可能会有中文乱码问题。
2、javaBean

/**
 * 将配置文件中配置的每一个属性的值,映射到这个组件中
 * @ConfigurationProperties:告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定;
 *      prefix = "student":配置文件中student配置下面的所有属性进行一一映射
 *
 * 只有这个组件是容器中的组件,才能容器提供的@ConfigurationProperties功能;
 *
 */
@Component
@ConfigurationProperties(prefix = "student")
public class Student {

	private String name;
	private Integer age;
	private boolean first;
	private Date birth;
	private Map<String, Integer> score;
	private List<String> teachers;
	private Dog dog;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Integer getAge() {
		return age;
	}
	public void setAge(Integer age) {
		this.age = age;
	}
	public boolean isFirst() {
		return first;
	}
	public void setFirst(boolean first) {
		this.first = first;
	}
	public Date getBirth() {
		return birth;
	}
	public void setBirth(Date birth) {
		this.birth = birth;
	}
	public Map<String, Integer> getScore() {
		return score;
	}
	public void setScore(Map<String, Integer> score) {
		this.score = score;
	}
	public List<String> getTeachers() {
		return teachers;
	}
	public void setTeachers(List<String> teachers) {
		this.teachers = teachers;
	}
	public Dog getDog() {
		return dog;
	}
	public void setDog(Dog dog) {
		this.dog = dog;
	}
	@Override
	public String toString() {
		return "Student [name=" + name + ", age=" + age + ", first=" + first + ", birth=" + birth + ", score=" + score
				+ ", teachers=" + teachers + ", dog=" + dog + "]";
	}
	
	
}


public class Dog {

	private String name;
	private Integer age;
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Integer getAge() {
		return age;
	}
	public void setAge(Integer age) {
		this.age = age;
	}
	@Override
	public String toString() {
		return "Dog [name=" + name + ", age=" + age + "]";
	}
	
}

3、创建一个Spring Boot的单元测试类测试一下:

/**
 * 
 * @author dmf
 *
 * spring boot单元测试
 * 可以在测试期间很方便的类似编码一样进行自动注入
 */
@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringBootDemoTests {
	@Autowired
	Student student;

	@Test
	public void contextLoads() {
		System.out.println(student);
	}

}

使用@value注解方式:
1、配置文件同上。
2、JavaBean
这里只加三个测试一下,

@Component
//@ConfigurationProperties(prefix = "student")
//@Validated//数据校验
public class Student {

	/**
     * <bean class="Student">
     *      <property name="lastName" value="字面量/${key}从环境变量、配置文件中获取值/#{SpEL}"></property>
     * <bean/>
     */
    //@Email检验这个属性是不是email类型的
	@Value("${student.name}")
	private String name;
	@Value("#{11*2}")
	private Integer age;
	@Value("true")
	private boolean first;
	...
}

@ConfigurationProperties和@Value的区别

@ConfigurationProperties @Value
功能 批量注入配置文件中的属性 一个个指定
松散绑定(松散语法) 支持 不支持
SpEL 不支持 支持
JSR303数据校验 支持 不支持
复杂类型封装 (map,list 等) 支持 不支持

当我们只是在需要获取一下配置文件中的某项值,使用@Value;当我们专门编写了一个javaBean来和配置文件进行映射,我们就直接使用@ConfigurationProperties;
配置提示:
在pom中导入如下依赖:

	<!--导入配置文件处理器,配置文件进行绑定就会有提示 -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-configuration-processor</artifactId>
			<optional>true</optional>
		</dependency>

@PropertySource注解和@ImportResource注解:
@PropertySource注解是用来加载指定的配置文件,只可以加载proprties文件,无法加载yaml文件,可以加载多个。例如上文示例的student配置,我们可以新建student.properties文件,将相关配置全放入这个配置文件中,然后使用@PropertySource加载进来:

@PropertySource(value={"classpath:student.properties"},encoding="utf-8")
@Component
@ConfigurationProperties(prefix = "student")//默认加载主配置文件application的配置
//@Validated//数据校验
public class Student {
      ...
}

使用这个注解还可以设置编码,就可以解决上文的properties中文乱码问题。

@ImportResource注解是用来导入Spring的xml配置文件,让配置文件里面的内容生效。
示例:
1、编写beans.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">


    <bean id="helloService" class="com.dmf.springboot.service.HelloService"></bean>
</beans>

HelloService就是一个普通java类,里面啥也不写。
2、加一个单元测试方法

@Autowired
	ApplicationContext ioc;
	
	@Test
	public void testHelloService(){
		boolean b = ioc.containsBean("helloService");
		System.out.println(b);
	}

一般我们不使用这种方式往容器中添加组件。而是使用全注解的方式,写一个配置类,使用@Configuration标注,然后写一个方法,返回值就是我们要加到容器中的组件使用@Bean标注

/**
 * @Configuration:指明当前类是一个配置类;就是来替代之前的Spring配置文件
 *
 * 在配置文件中用<bean><bean/>标签添加组件
 *
 */
@Configuration
public class MyAppConfig {
	
	@Bean
	public HelloService helloService(){
		return new HelloService();
	}

}

四、配置文件占位符

1、配置文件中可以使用随机数:
${random.value}、${random.int}、${random.long}、${random.int(10)}、${random.int[1024,65536]}
2、属性配置占位符:
可以在配置文件中引用前面配置过的属性(优先级前面配置过的这里都能用)。${app.name:默认值}来指定找不到app.name属性时的默认值。示例:

student.name=张三${random.uuid}
...
student.dog.name=${student.name}_旺财

五、Profile多环境支持

Profile是Spring对不同环境提供不同配置功能的支持,可以通过激活、指定参数等方式快速切换环境。配置文件默认都在src/main/resources文件夹下。
1、多profile文件形式。格式:application-{profile}.properties/yml。例如:application-dev.properties、application-prod.properties。默认使用application.properties的配置。然后在application.properties中配置激活:

##激活application-dev.properties配置文件
spring.profiles.active=dev

2、yaml多文档块模式。使用yaml的多文档块模式也可完成此功能:

#激活prod
server:
   port: 8081
spring:
   profiles:
      active: prod
---
server:
   port: 8082
spring:
   profiles: dev
      
---  
server:
   port: 8083
spring:
   profiles: prod

3、激活
除了上面提到可以使用配置文件配置激活指定的profile。还可以使用命令行以及JVM参数的形式激活。
命令行:
参数是:

--spring.profiles.active=dev

在eclipse中可以在Run As>Run Configurations>Arguments中的Peogram arguments配置此参数。
在这里插入图片描述
在生产环境时我们往往使用的是jar包,此时可以使用此命令:

java -jar springbootDemo-0.0.1-SNAPSHOT.jar --spring.profiles.active=dev

虚拟机:
参数:

–Dspring.profiles.active=dev

在eclipse中同上操作,不过是在 VM arguments配置参数
在这里插入图片描述

六、配置文件加载位置

spring boot 启动会扫描以下位置的application.properties或者application.yml文件作为Spring boot的默认配置文件:

  • file:./config/ 项目根目录下config文件夹
  • file:./ 项目根目录下
  • classpath:/config/ 类路径下config文件夹(其实就是src/main/resources/config)
  • classpath:/ 类路径下(其实就是src/main/resources)

以上是按照优先级从高到低的顺序,所有位置的文件都会被加载,高优先级配置内容会覆盖低优先级配置内容,SpringBoot会从这四个位置全部加载主配置文件形成互补配置。
当项目打包好以后,我们可以使用–spring.config.location命令行参数的形式,启动项目的时候来指定配置文件的新位置;指定配置文件和默认加载的这些配置文件共同起作用形成互补配置;

java -jar springbootDemo-0.0.1-SNAPSHOT.jar --spring.config.location=D:/application.properties

配置加载顺序:
1. 命令行参数
2. 来自java:comp/env的JNDI属性
3. Java系统属性(System.getProperties())
4. 操作系统环境变量
5. RandomValuePropertySource配置的random.*属性值
6. jar包外部的application-{profile}.properties或application.yml(带spring.profile)配置文件
7. jar包内部的application-{profile}.properties或application.yml(带spring.profile)配置文件
8. jar包外部的application.properties或application.yml(不带spring.profile)配置文件
9. jar包内部的application.properties或application.yml(不带spring.profile)配置文件
10. @Configuration注解类上的@PropertySource
11. 通过SpringApplication.setDefaultProperties指定的默认属性

官方参考文档(2.1.1)

展开阅读全文

没有更多推荐了,返回首页