springboot文件的加载位置,springBoot在启动的时候,我们会把application.properties,或者application.yml,
作为主配置文件,但是他的配置文件位置,既可以放到这个类路径下,也可以放在指定位置,比如第一个位置,你放在
config文件夹下面,或者直接放在当前项目的文件路径下,或者你放在类路径下的config下,或者你放在类路径的根目录
里面,这个四个位置Springboot都可以识别,而且是按照四个位置的优先级,首先是第一个位置的文件,然后依次往下加载,
由高到低,如果第一个文件配置的内容,已经加载过,在最后一个文件里边,也有配置相同的内容,那么高优先级就会覆盖
低优先级
你也可以在类路径的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会从这四个位置全部加载主配置文件,不是说高优先级
的文件有了,后面的就不看了,高优先级有后面还要加载,一加载以后会形成一种效果,互补配置,什么叫互补配置呢,我来给大家举个例子
现在我来到配置文件,我们这个配置文件都在配端口,生效的最终是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,所以指定配置文件的位置,怎么指定呢,
我们是在运维的时候,比如我们将项目已经发布了,项目打包了,我们可以使用命令行参数的形式,启动项目的时候,
来指定配置文件的新位置,然后还是一句话,指定的配置文件,和默认加载的这些配置文件,会一起起作用,共同起作用,
形成互补配置,我来演示一下这个效果
我们来把项目打包一下,在我们这个maven里边,打包我们这个项目,我们这个项目打包以后呢,我们看到打包成功,
这块有一个jar,我们直接访问target目录,target下有我们的jar包,我现在要执行这个jar包咋执行呢,但是我手动
来给你置顶spring.config.location,命令行参数都是--
现在启动起来在8085端口,那我们就来访问8085,关键我们指定的配置文件也只是端口,而路径是在低优先级里规定路径的,
能不能起作用呢,也是可以的,这个特性在我们运维的时候,也是非常的好用,比如我们已经把项目打包成功了,但是由于我们
再后来运行的时候,可能需要修改一些配置,怎么办呢,只需要编写少量的配置,我们把项目重新启动,让他们来加载新改的配置,
那么项目原来的配置,也会在,我们新改的配置,也会应用上,我们不需要把整个项目打包以后,再运行,这就是我们配置文件的
加载位置,从高到低,依次往下加载,然后形成互补配置