首页 > 其他分享 >springboot配置文件

springboot配置文件

时间:2023-07-10 14:57:30浏览次数:45  
标签:resource springboot 配置文件 spring yml import properties

1. 配置文件

1.1 外部加载顺序

  1. 命令行参数

     java -jar spring-boot-02-config-02.0.0.1-SNAPSHOT.jar --server.port=8087
     java -jar spring-boot-02-config-02.0.0.1-SNAPSHOT.jar --spring.profiles.active=prod
    
  2. 来自java:comp/env的NDI属性

  3. Java系统属性(System.getProperties() )

  4. 操作系统环境变量

  5. RandomValuePropertySource配置的random.*属性值

  6. jar包外部的application-{profile}.propertiesapplication.yml(带spring.profile)配置文件

     -hello
     |- a.jar
     |- application.yml
    

    将打好的jar包放在一个目录下,比如叫做 hello的文件夹,然后再该文件夹下新建一个名为application.yml的文件,其中指定port为8088
    ,访问路径为/boot ,然后命令行直接启动项目。java -jar a.jar
    浏览器通过 localhost:8088/boot/hello 可以正常访问,表示同级目录下的配置文件生效了。

  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. jar包内部的application.properties或application.yml(不带spring.profile)配置文件

  11. @Configuration注解类上的propertySource

  12. 通过SpringApplication.setDefaultProperties指定的默认属性。

1.2 springboot内部加载顺序

  1. 配置文件可以放在下面四个地方(优先级依次)
    • file:./config:项目根目录中config下
    • file:./:项目根目录下
    • classpath:./config:项目的resources目录中config下
    • classpath:./:项目的resources目录下

当使用的项目是module级别的时候,必须使用级别是project级别才能扫描到 file: 下面的文件

  1. 同目录下.properties的优先级比.yml高,
  2. 如果同一个配置属性,多个文件都配置了,默认使用第一次读取到的,后续不覆盖
  3. 高优先级会覆盖低优先级

1.3 改变默认的配置文件位置

**项目打包好以后,我们可以使用命令行参数的形式,启动项目的时候来指定配置文件的新位置;指定默认加载的这些配置文件共同起作用形成互补配置
**

在 G盘目录下,创建一个application.properties文件(yml也可以),定义端口为8085

打包项目,启动命令行:

java -jar  spring-boot-02-config-02.0.0.1-SNAPSHOT.jar  --spring.config.location=G:/application.properties

回车运行。

浏览器访问: http:localhost:8005/boot02/hello ,显然外部指定的配置文件生效了,并且与之前的主配置文件形成了互补配置

1.4 使用profile配置和加载配置文件

1.4.1 使用.properties文件

假如有开发、测试、生产三个不同的环境,需要定义三个不同环境下的配置

application.properties
applicaiton-dev.properties
applictiong-test.properties
applicaiton-prod.properties

application.properties文件中指定当前使用的环境:

server.port=8001
# 激活哪个配置文件
spring.profiles.active=dev
#spring.profiles.active=dev,prod,test
spring.profiles.include=prod

1.4.2 使用.yml文件

因为在yml文件中,---表示文档分隔符,每个文档独立,所以此时只需要一个.yml文件

spring:
  profiles:
    active: prod

---
spring:
  profiles: dev

server: 8080

---
spring:
  profiles: test

server: 8081

---
spring.profiles: prod
spring.profiles.include:
  - proddb
  - prodmq

server: 8082

---
spring:
  profiles: proddb

db:
  name: mysql

---
spring:
  profiles: prodmq

mq:
  address: localhost

此时读取的就是prod的配置,prod包含proddb,prodmq,此时可以读取proddb,prodmq下的配置

也可以同时激活三个配置spring.profiles.active: prod,proddb,prodmq

1.4.3 使用Java中的@Profile注解

@Profile注解只能配合@Configuration@Component使用


@Configuration
@Profile("prod")
public class ProductionConfiguration {

    // ...

}

1.5 读取自定义配置文件

1.5.1 利用 @PropertiesSource 注解来实现

@PropertiesSource 可以用来加载指定的配置文件,默认只能加载 *.properties 文件, 不能加载 yml 等文件

相关属性

  • value: 指明加载配置文件的路径
  • ignoreResourceNotFound:指定的配置文件不存在是否报错,默认是false。当设置为 true 时,若该文件不存在,程序不会报错。实际项目开发中,最好设置
    ignoreResourceNotFound 为 false。
  • encoding:指定读取属性文件所使用的编码,我们通常使用的是UTF-8。

示例

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;

@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Configuration
@PropertySource(value = {"classpath:common.properties"}, ignoreResourceNotFound = false, encoding = "UTF-8")
@ConfigurationProperties(prefix = "author")// 这个注解的作用是指明配置文件中需要注入信息的前缀
public class Author {
    private Stirng name;
    private String job;
    private String sex;
}

当需要用 yml作为配置文件时此时我们可以通过实现PropertySourceFactory接口,重写createPropertySource方法,就能实现用@PropertySource也能加载yaml等类型文件。

import org.springframework.beans.factory.config.YamlPropertiesFactoryBean;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.env.PropertiesPropertySource;
import org.springframework.core.io.support.EncodedResource;
import org.springframework.core.io.support.PropertySourceFactory;
import org.springframework.util.StringUtils;

import java.io.FileNotFoundException;
import java.util.Properties;

public class YamlPropertiesSourceFactory implements PropertySourceFactory {
    @Override
    public PropertySource<?> createPropertySource(String sourceName, EncodedResource resource) throws IOException {
        Properties propertiesFromYaml = loadYaml(resource);
        if (StringUtils.isBlank(sourceName)) {
            sourceName = resource.getResource().getFilename();
        }
        return new PropertiesPropertySource(sourceName, propertiesFromYaml);
    }

    private Properties loadYaml(EncodedResource resource) throws FileNotFoundException {
        try {
            YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean();
            factory.setResources(resource.getResource());
            factory.afterPropertiesSet();
            return factory.getObject();
        } catch (IllegalStateException e) {
            Throwable cause = e.getCause();
            if (cause instanceof FileNotFoundException) {
                throw (FileNotFoundException) cause;
            }
            throw e;
        }
    }
}
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;

@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Configuration
// 指明上面写好的工厂类
@PropertySource(factory = YamlPropertySourceFactory.class, value = {"classpath:user.yml"},
        ignoreResourceNotFound = false, encoding = "UTF-8")
@ConfigurationProperties(prefix = "author")// 这个注解的作用是指明配置文件中需要注入信息的前缀
public class Author {
    private Stirng name;
    private String job;
    private String sex;
}

1.5.2 使用 EnvironmentPostProcessor 加载自定义配置文件

实现流程

  1. 实现EnvironmentPostProcessor接口,重写postProcessEnvironment方法
public class MyEnvironmentPostProcessor implements EnvironmentPostProcessor {
   @Override
   public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {
      String[] profiles = {"config/test.properties", "config/custom.properties", "config/blog.yml"};

      for (String profile : profiles) {
         Resource resource = new ClassPathResource(profile);
         environment.getPropertySources().addLast(loadProfiles(resource));
      }
   }

   private PropertySource<?> loadProfiles(Resource resource) {
      if (!resource.exists()) {
         throw new IllegalArgumentException("资源不存在");
      }
      if (resource.getFilename().endsWith("yml")) {
         return loadYaml(resource);
      } else {
         return loadProperty(resource);
      }
   }

   private PropertySource loadProperty(Resource resource) {
      try {
         Properties properties = new Properties();
         properties.load(resource.getInputStream());
         return new PropertiesPropertySource(resource.getFilename(), properties);
      } catch (Exception e) {
         throw new IllegalStateException("加载Property配置文件失败", e);
      }
   }

   private PropertySource loadYaml(Resource resource) {
      try {
         YamlPropertiesFactoryBean factoryBean = new YamlPropertiesFactoryBean();
         factoryBean.setResources(resource);

         Properties properties = factoryBean.getObject();
         return new PropertiesPropertySource(resource.getFilename(), properties);
      } catch (Exception e) {
         throw new IllegalStateException("加载Yaml配置文件失败", e);
      }
   }
}
  1. 在META-INF下创建spring.factories
# spring.factories 文件内容如下:
# 启用自定义环境处理类
org.springframework.boot.env.EnvironmentPostProcessor=com.zhangyu.config.MyEnvironmentPostProcessor

1.6 SpringBoot使用通配符加载配置文件

还可以使用通配符加载自定义配置文件,貌似是spring的实现方式


@Configuration
public class PropertyConfig {
 
   @Bean
   public PropertySourcesPlaceholderConfigurer getPropertySourcesPlaceholderConfigurer() throws IOException {
      PropertySourcesPlaceholderConfigurer configurer = new PropertySourcesPlaceholderConfigurer();
      configurer.setLocations(new PathMatchingResourcePatternResolver().getResources("classpath:properties/*.properties"));
      return configurer;
   }
}

classpath*:classpath: 的区别是

classpath:: 只会到你的class路径中查找找文件。

classpath*:: 不仅包含class路径,还包括jar文件中(class路径)进行查找。

标签:resource,springboot,配置文件,spring,yml,import,properties
From: https://www.cnblogs.com/zerozayu/p/17541153.html

相关文章

  • SpringBoot集成JApiDocs实现自动生成接口文档
    一、概念JApiDocs是一个符合Java编程习惯的Api文档生成工具。最大程度地利用Java的语法特性,你只管用心设计好接口,添加必要的注释,JApiDocs会帮你导出一份漂亮的Html文档,并生成相关的Java和Object-C相关数据模型代码,从此,Android和IOS的同学可以少敲很多代码了,你也不......
  • SpringBoot+Mybatis搭建之采坑记录(持续更新...)
    Stoppingservice[Tomcat] 1.缺少Serivce注解无法启动tomcat 2.包名错误3.写了注解没写参数使用Eclipse调试Springboot项目时总是直接进入SilentExitExceptionHandler解决方案:Window-->Preference-->java-->debug-->Suspendexecutiononuncaughtexceptions选项前面的勾......
  • Eclipse搭建springBoot进阶篇-SpringBoot+Mybatis
    Eclipse搭建springBoot入门篇 在入门篇了搭建了一个简单的SpringBoot的Demo,在进阶篇将真正引入实战,也就是能支撑基本的企业中小型项目开发。本次通过springBoot+Mybatis+maven等搭建一个适用于开发中小型项目的简单架构pom文件需要更新maven的jar,对java包进行下载。<?xmlversi......
  • Eclipse搭建springBoot入门篇
    一、SpringBoot介绍SpringBoot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。通过这种方式,SpringBoot致力于在蓬勃发展的快速应用开发领域(rapidapplicati......
  • 新版Springboot3.0打造能落地的高并发仿12306售票系统
    第1章课程介绍与学习指南3节|22分钟本章主要对课程做整体介绍,其中包括:课程要解决的问题、课程特色和亮点、课程内容安排、学完大家的收获,以及在学习方法上提出的建议与指导。 第2章12306这个系统架构到底有多牛?8节|71分钟本章主要对课程为什么选择12306课程作为实战......
  • 1-快速上手SpringBoot
    1.SpringBoot入门程序制作(一)【idea联网版】步骤①:创建新模块,选择SpringInitializr,并配置模块相关基础信息特别关注:第3步点击Next时,Idea需要联网状态才可以进入到后面那一页,如果不能正常联网,就无法正确到达右面那个设置页了,会一直联网转圈特别关注:第5步选择java......
  • SpringBoot整合Sharding-JDBC水平分表
    本文使用Sharding-JDBC完成对订单表的水平分表,通过快速入门程序的开发,快速体验Sharding-JDBC的使用方法。首先创建两张表,t_order_1和t_order_2,这两张表是订单表拆分后的表,通过Sharding-Jdbc向订单表插入数据,按照一定的分片规则,主键为偶数的进入t_order_1,另一部分数据进入t_order_......
  • SpringBoot 集成异步线程调用
    步骤:1、在自动审核的方法上加上@Async注解(标明要异步调用)2、在文章发布成功后调用审核的方法3、在自媒体引导类中使用@EnableAsync注解开启异步调用 ......
  • Web开发|SpringBoot-Bean
    起因:经常在Config文件里看见Bean的存在,所以开始探究Bean的概念还使用方法。原文来自:https://gustavopeiretti.com/spring-boot-bean-annotation/#:~:text=What%20is%20%40Configuration%20in%20Spring,other%20parts%20of%20the%20application. 在SpringBoot中,@Bean是一个方......
  • SpringBoot 项目不加载 application.properties 配置文件
    yml或者properties文件没有被扫描到,需要在pom文件中<build></build>添加如下内容来保证文件都能正常被扫描到并且加载成功。<resources><resource><directory>src/main/java</directory><includes><include>**/*.yml</include......