SpringBoot的配置文件有两种格式,一种是以properties与yml或是yaml结尾的格式,他们的名称都要以application开头才可以;这两种格式的配置文件其实都是一样的,只是说他们的格式不一样,就跟我们之前的.jsp格式与.html格式一样,只是格式不一样的;

1、properties格式文件

格式:application.properties文件。配置tomcat启动时,端口号的配置

server.port=8081

他其实也是一个key=value的格式,值是直接赋值给对应的主键内容

 2、yml与yaml

这两个格式只是后缀名的问题,其实是一样的;就跟html与htm

Yml的格式的话,与properties文件的格式是完全不一样的两种;他的格式的话,主要是以各个层级的关系进行,会相对比较明了的看出各个层级之间的关系;各个层级之间都要做好缩进,同一层级之间的话,左边是需要对齐的:

比较重要的一点,就是在各个属性值的冒号后面,值的前面是要添加一个空格的,不添加的话,在运行的时候,会出现报错

格式:

server:
	port: 8081
	address:127.0.0.1

对比两个格式之间的区别

properties:

environments.dev.url=http://dev.bar.com
environments.dev.name=Developer Setup
environments.prod.url=http://foo.bar.com
environments.prod.name=My Cool App

yml:

environments:
    dev:
        url: http://dev.bar.com
        name: Developer Setup
    prod:
        url: http://foo.bar.com
        name: My Cool App

通过YAML的配置方式,我们可以看到配置信息利用阶梯化缩进的方式,其结构显得更为清晰易读,同时配置内容的字符量也得到显著的减少。除此之外,YAML还可以在一个单个文件中通过使用spring.profiles.active属性来定义多个不同的环境配置。例如下面的内容,在指定为test环境时,server.port将使用8882端口;而在prod环境,server.port将使用8883端口;如果没有指定环境,server.port将使用8881端口。

server:
  port: 8881

YML:小结

1、配置文件类型

        yml/yaml:需要注意空格;各小级之间的话,不能直接用tab进行缩进,因为每个电脑,每个系统的缩进个数是不一样的,这样会有问题

2、yaml:简洁、以数据为核心

        基本语法:

                大小写敏感

                数据值前边必须要有空格,作为分隔符(数量无要求)

                使用空格缩进表示层级关系,相同缩进表示同一级

        数据格式:

                对象

                数组,使用“-”表示数组每个原素

                纯量(单引号与双引号之间的差别,单引号直接将引号内的内容输出,双引号是识别)

        参数引用:

                ${key}

注意:YAML目前还有一些不足,它无法通过@PropertySource注解来加载配置。但是,YAML加载属性到内存中保存的时候是有序的,所以当配置文件中的信息需要具备顺序含义时,YAML的配置方式比起properties配置文件更有优势。

多环境配置:

我们在开发任何应用的时候,通常同一套程序会被应用和安装到几个不同的环境,比如:开发、测试、生产等。其中每个环境的数据库地址、服务器端口等等配置都会不同,如果在为不同环境打包时都要频繁修改配置文件的话,那必将是个非常繁琐且容易发生错误的事。

所以对于不同的环境,在SpringBoot中的可以采用更加简便的方式进行配置

在Spring Boot中多环境配置文件名需要满足application-{profile}.properties的格式,其中{profile}对应你的环境标识,比如:

  • application-dev.properties:开发环境
  • application-test.properties:测试环境
  • application-pre.properties:预生产环境
  • application-prod.properties:生产环境

 至于哪个具体的配置文件会被加载,需要在application.properties文件中通过spring.profiles.active属性来设置,其值对应配置文件中的{profile}值。如:spring.profiles.active=test就会加载application-test.properties配置文件内容。

自定义参数:

我们除了可以在Spring Boot的配置文件中设置各个Starter模块中预定义的配置属性,也可以在配置文件中定义一些我们需要的自定义属性。比如在application-test.properties中添加:

cmjConfig.name=miaomao

然后我们需要去定义我们的CmjConfig这个配置类,通过@value注解来加载这些自定义的参数值

package com.cmj.springBootTEST;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component
public class CmjConfig {
	@Value("${cmjConfig.name}")
	private String name;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public CmjConfig(String name) {
		super();
		this.name = name;
	}

	public CmjConfig() {
		super();
		// TODO Auto-generated constructor stub
	}

	@Override
	public String toString() {
		return "CmjConfig [name=" + name + "]";
	}


	
}

在我们的Controller层的编辑

package com.cmj.springBootTEST.WEB;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.cmj.springBootTEST.CmjConfig;



@RestController
@RequestMapping("hello2")
public class OneController {
	 
	 @Autowired
	 private CmjConfig cmjConfig;
	 @RequestMapping("")
     public String hello() {
		
		
		 System.out.println("e43333");
		 System.out.println(cmjConfig.getName());
            return "helloworld2"+cmjConfig.getName();

     }
}

通过注入的方式进行注入

  @Autowired
     private CmjConfig cmjConfig;

不能直接new这个的对象,会出现后面没有办法真的获取到对应内容

最后通过我们的main方法进行调用

package com.cmj.springBootTEST;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Configuration;

@Configuration
@EnableAutoConfiguration
@SpringBootApplication
public class App {
    public static void main( String[] args ){
        SpringApplication.run(App.class, args);
       
        

    }
}

我们在配置文件下配置多个内容时,比如:

name: didid

person:
   name: idjiji
   address: 127.0.0.1

配置文件下,有多个name属性值,这个时候我们如果想要person里面相关属性值时,我们需要在实体类上的@configurationProperties(prefix=“person”)去定义他的前缀是persn,这时,我们拿到的才是person中的属性值:

package com.cmj.springBootTEST;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Configuration
@ConfigurationProperties(prefix = "person")
public class Person {
	private String name;
	private int age;
	private String address;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}
	public Person(String name, int age, String address) {
		super();
		this.name = name;
		this.age = age;
		this.address = address;
	}
	public Person() {
		super();
		// TODO Auto-generated constructor stub
	}
	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + ", address=" + address + "]";
	}
	
}

@ConfigurationProperties 注解向Spring Boot声明该类中的所有属性和配置文件中相关的配置进行绑定。

  • prefix = "person":声明配置前戳,将该前戳下的所有属性进行映射。

@Component 或者@Configuration:将该组件加入Spring Boot容器,只有这个组件是容器中的组件,配置才生效。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐