springBoot 入门(二)—— 使用 spring.profiles.active来区分配置

springBoot 入门(二)—— 使用 spring.profiles.active来区分配置背景很多时候 我们项目在开发环境和生成环境的环境配置是不一样的 例如 数据库配置 在开发的时候 我们一般用测试数据库 而在生产环境的时候 我们是用正式的数据 这时候 我们可以利用 profile 在不同的环境下配置用不同的配置文件或者不同的配置 springboot 提供 springboot 允许你通过命名约定按照一定的格式 application profile propert

背景

很多时候,我们项目在开发环境和生成环境的环境配置是不一样的,例如,数据库配置,在开发的时候,我们一般用测试数据库,而在生产环境的时候,我们是用正式的数据,这时候,我们可以利用profile在不同的环境下配置用不同的配置文件或者不同的配置。

spring boot 提供

spring boot允许你通过命名约定按照一定的格式(application-{profile}.properties)来定义多个配置文件,然后通过在application.properyies通过spring.profiles.active来具体激活一个或者多个配置文件,如果没有没有指定任何profile的配置文件的话,spring boot默认会启动application-default.properties。

profile的配置文件可以按照application.properyies的放置位置一样,放于以下四个位置:

  • 当前目录的 “/config”的子目录下
  • 当前目录下
  • classpath根目录的“/config”包下
  • classpath的根目录下

demo 演示

#模拟测试变量 curvar=sit.curvar 

#模拟生产变量 curvar=prd.curvar 

这里写图片描述

我们在application.properyies也写上,并把profile切换到application-sit.properties的配置文件

#修改tomcat的默认的端口号,将8080改为8889 server.port=8889 #启用shutdown endpoint的HTTP访问 endpoints.shutdown.enabled=true #不需要用户名密码验证 endpoints.shutdown.sensitive=false #默认curvar值 curvar=default.curvar #切换配置文件 spring.profiles.active=sit 

可以通过这样子来测试

package HelloWord; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/task") public class TaskController { 
    @RequestMapping(value = { 
   "/",""}) public String hellTask(@Value("${curvar}")String cusvar ){ 
    return "hello task !! my current variable is " + cusvar; } } 

在这里可以看到spring.profiles.active激活的profile不同,打印出来的结果也不一样。

除了可以用profile的配置文件来分区配置我们的环境变量,在代码里,我们还可以直接用@Profile注解来进行配置,例如数据库配置,这里我们先定义一个接口

public interface DBConnector { 
    public void configure(); } 

分别定义俩个实现类来实现它

package config; import org.springframework.context.annotation.Profile; import org.springframework.stereotype.Component; / * 测试数据库 */ @Component @Profile("sitdb") public class SitDBConnector implements DBConnector { 
    @Override public void configure() { 
    System.out.println("sit-db"); } } 
package config; import org.springframework.context.annotation.Profile; import org.springframework.stereotype.Component; / * 生产数据库 */ @Component @Profile("prddb") public class PrdDBConnector implements DBConnector { 
    @Override public void configure() { 
    System.out.println("prd-db"); } } 

通过在配置文件激活具体使用哪个实现类

#修改tomcat的默认的端口号,将8080改为8889 server.port=8889 #启用shutdown endpoint的HTTP访问 endpoints.shutdown.enabled=true #不需要用户名密码验证 endpoints.shutdown.sensitive=false #默认curvar值 curvar=default.curvar #切换配置文件 #修改tomcat的默认的端口号,将8080改为8889 server.port=8889 #启用shutdown endpoint的HTTP访问 endpoints.shutdown.enabled=true #不需要用户名密码验证 endpoints.shutdown.sensitive=false #默认curvar值 curvar=default.curvar #切换配置文件 spring.profiles.active=sitdb 

然后就可以这么使用

package HelloWord; import config.DBConnector; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.ComponentScan; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/task") @ComponentScan(basePackages={ 
   "config"}) public class TaskController { 
    @Autowired DBConnector connector; @RequestMapping(value = { 
   "/",""}) public String hellTask(@Value("${curvar}")String cusvar ){ 
    connector.configure();//最终打印配置的db return "hello task !! my current variable is " + cusvar; } } 

这里写图片描述

#修改tomcat的默认的端口号,将8080改为8889 server.port=8889 #启用shutdown endpoint的HTTP访问 endpoints.shutdown.enabled=true #不需要用户名密码验证 endpoints.shutdown.sensitive=false #默认curvar值 curvar=default.curvar #切换配置文件 spring.profiles.include: prd,prddb 

以上就是spring boot用profile的作用。

以下为可选(主要是命令行使用):

通过命令行设置属性值

相信使用过一段时间Spring Boot的用户,一定知道这条命令:java -jar xxx.jar –server.port=8888,通过使用–server.port属性来设置xxx.jar应用的端口为8888。

在命令行运行时,连续的两个减号–就是对application.properties中的属性值进行赋值的标识。所以,java -jar xxx.jar –server.port=8888命令,等价于我们在application.properties中添加属性server.port=8888,该设置在样例工程中可见,读者可通过删除该值或使用命令行来设置该值来验证。

通过命令行来修改属性值固然提供了不错的便利性,但是通过命令行就能更改应用运行的参数,那岂不是很不安全?是的,所以Spring Boot也贴心的提供了屏蔽命令行访问属性的设置,只需要这句设置就能屏蔽:SpringApplication.setAddCommandLineProperties(false)。

多环境配置

 针对各环境新建不同的配置文件application-dev.properties、application-test.properties、application-prod.properties 在这三个文件均都设置不同的server.port属性,如:dev环境设置为8080,test环境设置为9090,prod环境设置为80 application.properties中设置spring.profiles.active=dev,就是说默认以dev环境设置 
 执行java -jar xxx.jar --spring.profiles.active=test,可以观察到服务端口被设置为9090,也就是测试环境的配置(test) 执行java -jar xxx.jar --spring.profiles.active=prod,可以观察到服务端口被设置为80,也就是生产环境的配置(prod) 

多环境高级应用

/ * 发送邮件接口. */ public interface EmailService { 
    /发送邮件*/ publicvoid send(); } 发送邮件的具体实现(dev-开发环境的代码): @Service @Profile("dev") //开发环境的时候. public class DevEmailServiceImpl implements EmailService{ 
    @Override publicvoid send() { 
    System.out.println("DevEmailServiceImpl.send().开发环境不执行邮件的发送."); } } 

发送邮件的具体实现(prod-生产环境的代码):

@Service @Profile("prod") //生产环境. public class ProdEmailServiceImpl2 implements EmailService{ 
    @Override publicvoid send() { 
    System.out.println("DevEmailServiceImpl.send().生产环境执行邮件的发送."); //具体的邮件发送代码. //mail.send(); } } 

Profile(“dev”)表明只有Spring定义的Profile为dev时才会实例化DevEmailService这个类。那么如何设置Profile呢?

在application.properties中加入:

spring.profiles.active=dev 

通过命令行参数

java -jar app.jar --spring.profiles.active=dev 
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/198665.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月26日 下午2:44
下一篇 2026年3月26日 下午2:45


相关推荐

  • 宿主机和虚拟机的网络_vmware独享宿主机网卡

    宿主机和虚拟机的网络_vmware独享宿主机网卡问题描述:宿主机为win10家庭版,虚拟机为Centos7,上午还可以正常的进行互通,中间应该是弹出来一个外设的接入通知,其他的没有什么明显的操作,下午就不能互相访问了,原因不明。解决方法:首先检查虚拟机的网络配置,分为如下几步:1、编辑–>虚拟机网络编辑器,选择桥接模式,同时选择要桥接的网络:这个网路需要和宿主机中的网络保持一致,如果宿主机中存在多个网络连接,比如无线连接和有线连接,那就根据实际需要,看虚拟机需要连接到哪个网络中,就对应选择。选择完之后,确

    2022年8月21日
    7
  • 冯诺依曼计算机体系[通俗易懂]

    冯诺依曼计算机体系1.存储器(指的是内存与外存)操作系统内核可以直接其中内存被分为用户空间与内核空间。

    2022年4月15日
    56
  • ntp本地时间源 linux,简单搭建本地ntp时间服务器

    标签(空格分隔):Linuxntpntp阶梯式架构图NTP(NetworkTimeProtocol):同步网络中各个计算机时间的协议.ntp服务器监听端口为UDP的123.本地ntp时间服务器:在本地的一台可连接互联网的主机Server上安装实现NTP协议的应用,其它本地局域网的各主机都定期来这台时间服务器获取(同步)时间,以保证各计算机的时间一致.开始实验❶准备若干台虚拟机(我这里用3台…

    2022年4月8日
    90
  • murmurhash2算法python3版本

    murmurhash2算法python3版本在翻译加密代码时遇到这个murmurhash2算法了,网上找了几个现成的加密结果对不上,自己手动对照原加密翻译了一般python3版本的。#-*-coding:utf-8-*-#@Time:2021/8/2614:40#@Note:Pleasedonotusethisprogramforillegaluses.importctypesdefunsigned_right_shitf(num,bit):returnctypes.c

    2022年10月18日
    6
  • 通讯协议与即时通讯[通俗易懂]

    通讯协议与即时通讯[通俗易懂]通讯协议与即时通讯

    2022年4月23日
    73
  • Android之布局详解

    Android之布局详解四种基本布局

    2022年6月2日
    58

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号