springboot文件的加载位置,springBoot在启动的时候,我们会把application.properties,或者application.yml,

作为主配置文件,但是他的配置文件位置,既可以放到这个类路径下,也可以放在指定位置,比如第一个位置,你放在

config文件夹下面,或者直接放在当前项目的文件路径下,或者你放在类路径下的config下,或者你放在类路径的根目录

里面,这个四个位置Springboot都可以识别,而且是按照四个位置的优先级,首先是第一个位置的文件,然后依次往下加载,

由高到低,如果第一个文件配置的内容,已经加载过,在最后一个文件里边,也有配置相同的内容,那么高优先级就会覆盖

低优先级

spring boot public 目录 springboot config目录_优先级

你也可以在类路径的conf文件下,比如resources下写一个config文件夹,然后我们调成8082

server.port=8082

那么是用8081端口还是8082端口呢,我们按照优先级的顺序,类路径下config文件夹下的东西,比类路径根目录下的

东西,优先级更高一点,所以应该是8082端口,我来启动测试一下,我们看到确实是8082

Tomcat started on port(s): 8082 (http)

当前文件的根目录下,我们项目的根目录下,我改成8083

server.port=8083

就按照8083启动了,这是8083,包括我们使用config文件夹

Tomcat started on port(s): 8083 (http)

server.port=8084

然后我们把application.properties放到里边,我用8084,按照优先级,文件下的config下的优先级是最高的

server.port=8084

Tomcat started on port(s): 8084 (http)

启动他就应该用8084,这就是我们的路径,记住这些优先级是由高到低,高优先级的配置,会覆盖低优先级的配置,

注意一句话,他叫覆盖,SpringBoot只要这四个都有文件,SpringBoot会从这四个位置全部加载主配置文件,不是说高优先级

的文件有了,后面的就不看了,高优先级有后面还要加载,一加载以后会形成一种效果,互补配置,什么叫互补配置呢,我来给大家举个例子

spring boot public 目录 springboot config目录_spring_02

现在我来到配置文件,我们这个配置文件都在配端口,生效的最终是8084端口,我在低优先级里面,再来配一个

server.context-path,含义就是项目的访问路径,比如我们叫boot02

server.context-path=/boot02

配置项目的访问路径,我们把这个配上以后呢,我们来启动项目,为了访问路径能够测试效果,我来写一个Controller,

我们叫HelloController,这里我们写一个@RestController,然后我们写一个hello方法,访问hello请求,@RequestMapping

我们来处理hello请求,我们来访问一下,来启动程序,我们启动首先看到,8084端口有效果,那是用到最高一级的8084,我再来

访问hello请求,首先是8084,我们访问8084下的hello不行

localhost:8084/hello

Tomcat started on port(s): 8084 (http)

我们加上项目名,boot02这就起作用了

localhost:8084/boot02/hello
package com.learn.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {
	
	@ResponseBody
	@RequestMapping("/hello")
	public String hello() {
		return "hello";
	}
}
package com.learn;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * @SpringBootApplication 来标注一个主程序类,说明这是一个Sprint Boot应用
 * @author Leon.Sun
 *
 */
//@ImportResource(locations= {"classpath:beans.xml"})
@SpringBootApplication
public class SpringBoot02ConfigApplication {

	public static void main(String[] args) {
		// Spring应用启动起来
		SpringApplication.run(SpringBoot02ConfigApplication.class,args);
	}
}
它会形成一个互补配置,高优先级的用高优先级,没有的使用低优先级,这是非常方便的,我们可以使用高优先级,

来覆盖部分内容,我们低优先级配置所有内容,我们还可以使用spring.config.location来改变默认配置文件位置,

这个怎么做呢,如果我们写到配置文件里边,你不管写哪里都是没啥用的,我来给大家举个例子,比如我们给某一个盘,

我们就是8085端口,我想用8085端口,我们把路径拿过来

spring.config.location=G:/application.properties

然后启动看能不能用到他,如果用到那就是8085端口,那我们看到还是8084,所以指定配置文件的位置,怎么指定呢,

我们是在运维的时候,比如我们将项目已经发布了,项目打包了,我们可以使用命令行参数的形式,启动项目的时候,

来指定配置文件的新位置,然后还是一句话,指定的配置文件,和默认加载的这些配置文件,会一起起作用,共同起作用,

形成互补配置,我来演示一下这个效果

spring boot public 目录 springboot config目录_配置文件_03

我们来把项目打包一下,在我们这个maven里边,打包我们这个项目,我们这个项目打包以后呢,我们看到打包成功,

这块有一个jar,我们直接访问target目录,target下有我们的jar包,我现在要执行这个jar包咋执行呢,但是我手动

来给你置顶spring.config.location,命令行参数都是--

spring boot public 目录 springboot config目录_spring_04

现在启动起来在8085端口,那我们就来访问8085,关键我们指定的配置文件也只是端口,而路径是在低优先级里规定路径的,

能不能起作用呢,也是可以的,这个特性在我们运维的时候,也是非常的好用,比如我们已经把项目打包成功了,但是由于我们

再后来运行的时候,可能需要修改一些配置,怎么办呢,只需要编写少量的配置,我们把项目重新启动,让他们来加载新改的配置,

那么项目原来的配置,也会在,我们新改的配置,也会应用上,我们不需要把整个项目打包以后,再运行,这就是我们配置文件的

加载位置,从高到低,依次往下加载,然后形成互补配置