spring @Profiles和@PropertySource实现根据环境切换配置文件

目录
  • @Profiles和@PropertySource根据环境切换配置文件
  • 利用spring.profiles.active=@spring.active@不同环境下灵活切换配置文件
    • 一、创建配置文件
    • 二、POM文件添加PROFILES配置
    • 三、具体应用

@Profiles和@PropertySource根据环境切换配置文件

使用@PropertySource注解加载配置文件,并制定解析配置文件的解析器默认是properties,可以自己指定使用Yml配置文件解析器。

@SpringBootApplication
@PropertySource(value = "classpath:config-${spring.profiles.active}.yml",
        encoding = "UTF-8",
        factory = YmlPropertySourceFactory.class)
public class Application {

    public static void main(String[] args) {
        try {
            SpringApplication.run(Application.class, args);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

resources下的需要一个全局配置文件application.yml(我使用的是yml格式配置文件),这个配置文件就是用来切换不同环境下的配置文件的,其他配置文件就根据环境做一个不同的后缀,config-dev.yml,config-pro.yml。

Yml格式配置文件的解析需要用下面方式切换一下。就是根据文件的后缀判断文件格式使用不同的配置文件加载器。

public class YmlPropertySourceFactory extends DefaultPropertySourceFactory {
    @Override
    public PropertySource<?> createPropertySource(String name, EncodedResource resource) throws IOException {
        String sourceName = name != null ? name : resource.getResource().getFilename();
        if (!resource.getResource().exists()) {
            return new PropertiesPropertySource(sourceName, new Properties());
        } else if (sourceName.endsWith(".yml") || sourceName.endsWith(".yaml")) {
            Properties propertiesFromYaml = loadYml(resource);
            return new PropertiesPropertySource(sourceName, propertiesFromYaml);
        } else {
            return super.createPropertySource(name, resource);
        }
    }

    private Properties loadYml(EncodedResource resource) throws IOException {
        YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean();
        factory.setResources(resource.getResource());
        factory.afterPropertiesSet();
        return factory.getObject();
    }
}

然后在公共配置文件application.yml中添加spring.profiles.active配置,值就是config-dev.yml中的dev或者pro。其实spring.profiles.active就是spring用来指定不同环境的,可以用@Profiles 和@ActiveProfiles注解来指定不同的配置文件,@Profiles注解在类或@bean注解的方法上可以实现不同的配置实例化不同的类,然后通过jvm参数来指定spring.profiles.active值就能做到运行切换配置环境了,jvm参数:

JAVA_OPTS=" -Xms1024m -Xmx1024m  -XX:PermSize=512m -XX:MaxPermSize=512m -Dspring.profiles.active=dev"

上面我提供的方式是在配置文件中修改一个参数的值达到切换配置文件的目的,@Profiles注解的方式是用jvm参数的方式在启动时切换配置文件,可以根据情况选择。

利用spring.profiles.active=@spring.active@不同环境下灵活切换配置文件

一、创建配置文件

配置文件结构:这里建三个配置文件,application.yml作为主配置文件配置所有共同的配置;-dev和-local分别配置两种环境下的不同配置内容,如数据库地址等。

application.yml中添加spring.profiles.active配置来动态加载活跃的配置文件:

spring:
  profiles:
    active: @spring.active@

二、POM文件添加PROFILES配置

<profiles>
	<profile>
		<id>local</id>
		<properties>
			<spring.active>local</spring.active>
		</properties>
		<activation>
			<activeByDefault>true</activeByDefault>
		</activation>
	</profile>
	<profile>
		<id>dev</id>
		<properties>
			<spring.active>dev</spring.active>
		</properties>
	</profile>
</profiles>

以上配置声明有两种配置文件、分别为dev和local。且默认使用local(通过true设置的)。

这样配置好的项目在maven中就多了一个配置项:

三、具体应用

1、使用mvn命令打包项目打包时

mvn clean package # 清理并打包命令,默认是使用local配置文件。

mvn clean package -P dev # 清理并指定配置文件打包命令,使用dev配置文件。

2、手动打包,通过勾选profiles选项切换配置文件

maven profiles中勾选dev,然后打包,则使用dev配置文件。

3、本地启动springboot时,以idea为例

如步骤2中勾选所需激活的配置文件后,启动application中的main方法则对应加载勾选中的配置文件。还可以在idea中配置指定加载配置文件,指定后勾选功能失效。方法如下:

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Spring Boot自定义配置属性源(PropertySource)

    配置覆盖优于profile 在生产实践中,配置覆盖是解决不同环境不同配置的常用方法.比如用生产服务器上的配置文件覆盖包内的文件,或者使用中心化的配置服务来覆盖默认的业务配置. 相比于profile机制(比如maven的profile.spring boot的profile-specific properties),即不同环境使用不同的配置文件,覆盖的方式更有优势.程序员在开发时不需要关心生产环境数据库的地址.账号等信息,一次构建即可在不同环境中运行,而profile机制需要将生产环境的配置写到项

  • Java之Spring认证使用Profile配置运行环境讲解

    Spring提供了@Profile注解来解决程序在不同运行环境时候的配置差别. 项目开发时候大多包含:开发.测试.上线运行几个过程,在每个过程中软件的工作环境一般多少有些差别,比如:在开发阶段利用本地数据库.测试阶段采用测试数据库.在上线运行阶段使用生产数据库.这些差别如果采用了手工维护就会存在各种问题:效率低下.容易发生人为因素意外错误. 利用Spring提供的@Profile注解就可以定义程序不同的运行场景配置,配置以后在启动程序时候给定不同的启动参数就可以灵活的切换运行场景,不再需要人工干

  • Spring 中如何根据环境切换配置 @Profile

    Spring 根据环境切换配置 @Profile 我们实际开发中往往有多个环境,比如测试环境.开发环境.生产环境等:不同的环境往往配置也有区别,一直切换环境的配置很麻烦,Spring 为我们提供了一个注解,可以快速切换环境配置. @Profile 我们新建一个配置,作用是注册三个数据源,因为不同的环境使用的数据库一般不一样: @Configuration @PropertySource("classpath:/person.properties") public class MainC

  • spring @Profiles和@PropertySource实现根据环境切换配置文件

    目录 @Profiles和@PropertySource根据环境切换配置文件 利用spring.profiles.active=@spring.active@不同环境下灵活切换配置文件 一.创建配置文件 二.POM文件添加PROFILES配置 三.具体应用 @Profiles和@PropertySource根据环境切换配置文件 使用@PropertySource注解加载配置文件,并制定解析配置文件的解析器默认是properties,可以自己指定使用Yml配置文件解析器. @SpringBootA

  • springboot 多环境切换的方法

    properties文件 profile是Spring对不同环境提供不同配置功能的支持,可以通过激活不同的环境版本,实现快速切换环境: 例如: application-test.properties 代表测试环境配置 application-dev.properties 代表开发环境配置 但是Springboot并不会直接启动这些配置文件,它默认使用application.properties主配置文件: 我们需要通过一个配置来选择需要激活的环境: spring.profiles.active=

  • SpringCloud Config配置中心原理以及环境切换方式

    目录 Config配置中心原理以及环境切换 原理介绍 一.ConfigServer引入依赖 二.Configclient 注意 简易配置中心原理及流程说明 原理 简易搭建例子 Config配置中心原理以及环境切换 springCloud config项目,用来为分布式的微服务系统中提供集成式外部配置支持,分为客户端和服务端 spring官方如下介绍: Spring Cloud Config provides server and client-side support for externali

  • 解决spring boot环境切换失效的问题

    目录 spring boot环境切换失效 概述 解决 springboot多环境配置文件无效 springboot配置文件无效 spring boot环境切换失效 概述 最近在使用-Dspring.profiles.active=te 来切换spring-boot的环境时,发现日志打印的是: ...ApplicationStartUp - The following profiles are active: de 也就是说,参数失效了. debug调试时,发现spring-boot读取的也是de

  • Spring boot中PropertySource注解的使用方法详解

    前言 本文将重点讲解一下Spring中@PropertySource注解的使用,如何通过PropertySource注解加载指定的配置文件.以及PropertySource注解与@ConfigurationProperties两个注解的配合使用.下面话不多说了,来随着小编来一起学习学习吧. 1.1. PropertySource注解加载指定的属性文件 Spring框架提供了PropertySource注解,目的是加载指定的属性文件,接下来我们看一下如何使用该注解.首先我们定义一个配置类,并在类中

  • 使用spring.profiles.active来分区配置的方法示例

    很多时候,我们项目在开发环境和生成环境的环境配置是不一样的,例如,数据库配置,在开发的时候,我们一般用测试数据库,而在生产环境的时候,我们是用正式的数据,这时候,我们可以利用profile在不同的环境下配置用不同的配置文件或者不同的配置 spring boot允许你通过命名约定按照一定的格式(application-{profile}.properties)来定义多个配置文件,然后通过在application.properyies通过spring.profiles.active来具体激活一个或者

  • Spring Boot使用profile如何配置不同环境的配置文件

    在springboot的开发中,有时候我们会有不同的配置,例如日志打印,数据库连接等,开发,测试,生产每个环境可能配置都不一致,还好,springboot支持通过不同的profile来配置不同环境的配置,下面就大致介绍一下yml配置文件跟properties配置文件怎么使用profile配置不同环境的配置文件... 先介绍一下开发环境: jdk版本是1.8 springboot的版本是1.4.1 开发工具为 intellij idea 我们先来介绍,使用一个yml文件,通过不同的profile来

  • spring boot使用logback实现多环境日志配置详解

    软件生存周期中,涉及代码运行的环节有编码.测试和维护阶段,而一套成熟的代码,在此三个阶段,数据库.日志路径.日志级别.线程池大小等配置一般会不一样.作为开发人员,希望将代码与配置解耦合,不同的环境,代码一套,而配置多套. 针对于多环境的配置,可以使用maven的profile及filter配置,在打包环节通过打包命令 mvn clean package -P dev/test/product决定所打环境的war/jar包.此种解决方案,产生的war\jar包在不同环境的是不同的,因此MD5校验和

随机推荐