【Spring Boot 2.0学习之旅-14】SpringBoot资源访问、环境配置等问题总结

【Spring Boot 2.0学习之旅-14】SpringBoot资源访问、环境配置等问题总结,第1张

【Spring Boot 2.0学习之旅-14】SpringBoot资源访问、环境配置等问题总结 SpringBoot资源访问配置等问题总结

文件系统是我们开发过程中常常会接触的问题。那么在Spring Boot框架中,文件的访问又是什么样的呢?

1.file和classpath

存放在电脑上实际位置的文件,在Spring Boot中用file:开头表示。例如:

file:a.txt 当前目录下的a.txt文件。当前路径在开发环境下一般为Maven项目的目录下(与pom.xml同目录下),在打包为jar文件后当前路径即为运行jar文件时的运行路径。file:D:a.txt 表示绝对路径,在此不多赘述。

而在jar文件内部中,我们一般把文件路径称为classpath,所以读取内部的文件就是从classpath内读取,classpath指定的文件不能解析成File对象,但是可以解析成InputStream。例如:

classpath:/a.txt jar包根目录下的a.txt。classpath以/开头表示绝对路径,即为jar包根目录。 2.Spring Boot的静态资源访问

我们都知道Spring Boot工程文件夹中的src/main/resources是用于存放资源的地方。默认时Spring Boot打包之后静态资源位置如下:

classpath:/staticclasspath:/publicclasspath:/resourcesclasspath:/meta-INF/resources

在Spring Boot中classpath的根目录就对应工程文件夹下的src/main/resources。

可以先看这个例子:

在工程文件夹下src/main/resources/static下放入图片qiqi.png:

运行,访问127.0.0.1:8080/qiqi.png,效果如下:

这个例子可见外部访问的资源路径和Spring Boot工程中资源文件路径的一一对应关系。即外部访问时的“根目录”即对应着上述的四个静态资源位置(classpath)。

还可以新建一个Controller类,写如下方法:

@GetMapping("/pic")
public String showPic() {
    return "/qiqi.png";
}

运行,访问127.0.0.1:8080/pic,效果同上。

在这个Controller方法中,上面@GetMapping是路由路径,return的是对应的资源路径。

其实这个默认的资源路径是可以修改的。

我们需要知道在配置文件application.properties中可以加入下列两个配置项:

spring.mvc.static-path-pattern
spring.web.resources.static-locations

我们来逐一进行讲解。

(1)spring.mvc.static-path-pattern

这个spring.mvc.static-path-pattern代表的是应该以什么样的路径来访问静态资源,也就是只有静态资源满足什么样的匹配条件,Spring Boot才会处理静态资源请求。说白了就是资源的外部访问路径。根据上述例子我们知道了这个配置默认值为/**。假设在上述工程配置文件中加入:

spring.mvc.static-path-pattern=/resources/**

那么再访问我们那个图片就要访问网址:127.0.0.1:8080/resources/qiqi.png

好了,我们如果现在想使用Controller类的@GetMapping进行路由的话,如果还是像上面那么写:

@GetMapping("/pic")
public String showPic() {
   return "/qiqi.png";
}

访问127.0.0.1:8080/pic,你会发现:

为什么这时就不行了呢?

这是因为我们改变了spring.mvc.static-path-pattern配置的值,那么我们对应的Controller类方法中的返回值,也要对应改变。

之前spring.mvc.static-path-pattern没有配置那默认就是/**,那访问/qiqi.png就可以找到图片。现在这个配置改为/resources/**,那很显然要访问/resources/qiqi.png了,再访问/qiqi.png当然访问不到了!因此对应的Controller类方法中也要做出对应修改。

上述配置spring.mvc.static-path-pattern为/resources/**,那么我们修改Controller方法如下:

@GetMapping("/pic")
public String showPic() {
   return "/resources/qiqi.png";
}

可见返回值改成了/resources/qiqi.png。

可见,Controller类中的方法的返回值,并非是资源文件的实际的相对路径,而是对应的资源的外部访问路径。这一点也是我和我身边许多朋友容易混淆的一点。

(2)spring.web.resources.static-locations

再者,spring.web.resources.static-locations用于指定静态资源文件的查找路径,查找文件是会依赖于配置的先后顺序依次进行。根据上述例子可见这个值默认是:

classpath:/static,classpath:/public,classpath:/resources,classpath:/meta-INF/resources

其实上面提到了Spring Boot默认资源文件位置,实质上就是这个配置的值。

假设在上述工程中配置文件写入:

spring.web.resources.static-locations=classpath:/myRes

那么我们要将qiqi.png放在项目文件夹的srcmainresourcesmyRes文件夹中,才能访问:

配置此项后,默认值将失效!

还可以使用磁盘路径例如:

spring.web.resources.static-locations=file:res

即指定资源文件在项目文件夹中的res目录中(即打包后运行jar文件时的运行路径下的res文件夹中)。也可以使用绝对路径。

3.Spring Boot的配置文件位置指定

我们也知道Spring Boot的配置文件默认是位于classpath:/application.properties,默认会被打包进jar文件。

其实我们也可以修改这个配置文件的位置。

在我们的Spring主类上加入如下注解:

@PropertySource(value={"自定义配置文件路径"})

value表示配置文件位置,也可以填多个:

@PropertySource(value={"配置1路径", "配置2路径"})

此处以我的主类全部代码为例:

package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.PropertySource;

@SpringBootApplication
@PropertySource(value={"file:self.properties"})
public class DemoApplication {

   public static void main(String[] args) {
      SpringApplication.run(DemoApplication.class, args);
   }

}

即定义配置文件为项目文件夹下的self.properties文件(打包后运行jar文件时的运行目录下的self.properties文件)。

4.多环境的配置文件方案

我们知道,默认情况下,我们可以在src/main/resources文件夹下创建多个配置文件以对应多个不同环境下的配置,方便灵活切换,例如开发-生产环境下,我们一共有三个配置文件:

application.properties
application-dev.properties
application-prod.propertie

然后在主配置文件application.properties里面配置一个配置项,即可一键切换配置环境:

# 指定当前使用开发环境配置文件
spring.profiles.active=dev
复制代码

我们默认的配置文件名是application,因此多环境的情况下,配置文件命名如下:

application-环境配置名.properties
复制代码

主配置文件就是application.properties,在里面配置:

spring.profiles.active=环境配置名
复制代码

运行时即可使用指定环境的配置文件。

这个时候想配置文件外置,如果按照上述第3部分的方法来,发现就不行了。那么多环境配置的情况下,配置文件如何外置呢?

我们需要先知道,其实Spring Boot会默认在这四个位置扫描配置文件:

file:./config/
file:./
classpath:/config/
classpath:/
复制代码

我们可以指定spring.config.location属性,来实现自定义Spring Boot的配置文件扫描路径。spring.config.location属性不仅可以设定扫描指定的配置文件,还可以指定扫描指定文件夹。

在我们的main方法中最开头,使用System.setProperty方法即可设定,下面给几个例子:

// 扫描项目文件夹(jar运行目录)中Resources/config目录中所有的配置文件
System.setProperty("spring.config.location", "file:Resources/config/");

// 扫描项目文件夹(jar运行目录)中Resources/config/app.properties文件
System.setProperty("spring.config.location", "file:Resources/config/app.properties");

// 扫描项目文件夹(jar运行目录)中Resources/config目录和Resources/config2目录中所有的配置文件
System.setProperty("spring.config.location", "file:Resources/config/, file:Resources/config2/");
复制代码

可见spring.config.location属性比较灵活,既可以设定文件还可以指定文件夹,注意指定的如果是文件夹,路径最后一定要以/结尾。指定多个文件或者文件夹时路径中间以英文逗号分隔。

好了,知道了spring.config.location属性,我们就知道多环境配置文件外置的方法了。例如我想把所有配置文件application.properties、application-dev.properties和application-prod.properties放到项目文件夹下的Resources/config目录下,那么我的完整主类代码如下:

package com.gitee.swsk33.test;

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

@SpringBootApplication
public class TestApplication {

   public static void main(String[] args) {
      // 设定配置文件扫描目录
      System.setProperty("spring.config.location", "file:Resources/config/");
      SpringApplication.run(TestApplication.class, args);
   }

}

可见很简单,只在主方法main中最头部写了System.setProperty("spring.config.location", "file:Resources/config/");这一行代码即可完成配置。

  System.setProperty("spring.config.location", "file:Resources/config/");
      SpringApplication.run(TestApplication.class, args);
   }

}

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5708647.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-18

发表评论

登录后才能评论

评论列表(0条)

保存