java profiles_使用Profiles

java profiles_使用ProfilesProfile 本身是 Spring 提供的功能 我们在使用条件装配中已经讲到了 Profile 表示一个环境的概念 如开发 测试和生产这 3 个环境 nativetestpr 或者按 git 分支定义 master dev 这些环境 masterdev 在启动一个 Spring 应用程序的时候 可以传入一个或多个环境 例如 Dspring profiles active test master 大多数情况下

Profile本身是Spring提供的功能,我们在使用条件装配中已经讲到了,Profile表示一个环境的概念,如开发、测试和生产这3个环境:

native

test

production

或者按git分支定义master、dev这些环境:

master

dev

在启动一个Spring应用程序的时候,可以传入一个或多个环境,例如:

-Dspring.profiles.active=test,master

大多数情况下,使用一个环境就足够了。

Spring Boot对Profiles的支持在于,可以在application.yml中为每个环境进行配置。下面是一个示例配置:

spring:

application:

name: ${APP_NAME:unnamed}

datasource:

url: jdbc:hsqldb:file:testdb

username: sa

password:

dirver-class-name: org.hsqldb.jdbc.JDBCDriver

hikari:

auto-commit: false

connection-timeout: 3000

validation-timeout: 3000

max-lifetime: 60000

maximum-pool-size: 20

minimum-idle: 1

pebble:

suffix:

cache: false

server:

port: ${APP_PORT:8080}

spring:

profiles: test

server:

port: 8000

spring:

profiles: production

server:

port: 80

pebble:

cache: true

注意到分隔符—,最前面的配置是默认配置,不需要指定Profile,后面的每段配置都必须以spring.profiles: xxx开头,表示一个Profile。上述配置默认使用8080端口,但是在test环境下,使用8000端口,在production环境下,使用80端口,并且启用Pebble的缓存。

如果我们不指定任何Profile,直接启动应用程序,那么Profile实际上就是default,可以从Spring Boot启动日志看出:

2020-06-13 11:20:58.141 INFO 73265 — [ restartedMain] com.itranswarp.learnjava.Application : Starting Application on … with PID 73265 …

2020-06-13 11:20:58.144 INFO 73265 — [ restartedMain] com.itranswarp.learnjava.Application : No active profile set, falling back to default profiles: default

要以test环境启动,可输入如下命令:

$ java -Dspring.profiles.active=test -jar springboot-profiles-1.0-SNAPSHOT.jar

. ____ _ __ _ _

/\\ / ___’_ __ _ _(_)_ __ __ _ \ \ \ \

( ( )\___ | ‘_ | ‘_| | ‘_ \/ _` | \ \ \ \

\\/ ___)| |_)| | | | | || (_| | ) ) ) )

‘ |____| .__|_| |_|_| |_\__, | / / / /

=========|_|==============|___/=/_/_/_/

:: Spring Boot :: (v2.3.0.RELEASE)

2020-06-13 11:24:45.020 INFO 73987 — [ main] com.itranswarp.learnjava.Application : Starting Application v1.0-SNAPSHOT on … with PID 73987 …

2020-06-13 11:24:45.022 INFO 73987 — [ main] com.itranswarp.learnjava.Application : The following profiles are active: test

2020-06-13 11:24:47.533 INFO 73987 — [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8000 (http) with context path ”

从日志看到活动的Profile是test,Tomcat的监听端口是8000。

通过Profile可以实现一套代码在不同环境启用不同的配置和功能。假设我们需要一个存储服务,在本地开发时,直接使用文件存储即可,但是,在测试和生产环境,需要存储到云端如S3上,如何通过Profile实现该功能?

首先,我们要定义存储接口StorageService:

public interface StorageService {

// 根据URI打开InputStream:

InputStream openInputStream(String uri) throws IOException;

// 根据扩展名+InputStream保存并返回URI:

String store(String extName, InputStream input) throws IOException;

}

本地存储可通过LocalStorageService实现:

@Component

@Profile(“default”)

public class LocalStorageService implements StorageService {

@Value(“${storage.local:/var/static}”)

String localStorageRootDir;

final Logger logger = LoggerFactory.getLogger(getClass());

private File localStorageRoot;

@PostConstruct

public void init() {

logger.info(“Intializing local storage with root dir: {}”, this.localStorageRootDir);

this.localStorageRoot = new File(this.localStorageRootDir);

}

@Override

public InputStream openInputStream(String uri) throws IOException {

File targetFile = new File(this.localStorageRoot, uri);

return new BufferedInputStream(new FileInputStream(targetFile));

}

@Override

public String store(String extName, InputStream input) throws IOException {

String fileName = UUID.randomUUID().toString() + “.” + extName;

File targetFile = new File(this.localStorageRoot, fileName);

try (OutputStream output = new BufferedOutputStream(new FileOutputStream(targetFile))) {

input.transferTo(output);

}

return fileName;

}

}

而云端存储可通过CloudStorageService实现:

@Component

@Profile(“!default”)

public class CloudStorageService implements StorageService {

@Value(“${storage.cloud.bucket:}”)

String bucket;

@Value(“${storage.cloud.access-key:}”)

String accessKey;

@Value(“${storage.cloud.access-secret:}”)

String accessSecret;

final Logger logger = LoggerFactory.getLogger(getClass());

@PostConstruct

public void init() {

// TODO:

logger.info(“Initializing cloud storage…”);

}

@Override

public InputStream openInputStream(String uri) throws IOException {

// TODO:

throw new IOException(“File not found: ” + uri);

}

@Override

public String store(String extName, InputStream input) throws IOException {

// TODO:

throw new IOException(“Unable to access cloud storage.”);

}

}

注意到LocalStorageService使用了条件装配@Profile(“default”),即默认启用LocalStorageService,而CloudStorageService使用了条件装配@Profile(“!default”),即非default环境时,自动启用CloudStorageService。这样,一套代码,就实现了不同环境启用不同的配置。

练习

小结

Spring Boot允许在一个配置文件中针对不同Profile进行配置;

Spring Boot在未指定Profile时默认为default。

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

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

(0)
上一篇 2026年3月18日 下午5:39
下一篇 2026年3月18日 下午5:39


相关推荐

  • RabbitMQ延迟队列

    RabbitMQ延迟队列RabbitMQ 延迟队列使用场景消息延迟推送的 预支付订单创建成功后 30 分钟后还未完成支付则自动修改订单状态 自动取消订单 用户注册成功后 如果 3 天没有登录则进行短信提醒 优惠券过期前发送短信进行提醒等业务场景

    2026年3月18日
    2
  • 装OpenClaw送小龙虾!京东云OpenClaw现场免费安装

    装OpenClaw送小龙虾!京东云OpenClaw现场免费安装

    2026年3月13日
    1
  • 2020年Java就业前景和工资待遇分析,还适合入行吗?

    2020年Java就业前景和工资待遇分析,还适合入行吗?当今社会,软件产业已经充斥在我们工作和生活中的各种角落。不论是上班还是娱乐,现在人们都离不开电脑、网络,然后我们会发现,真正提供我们方便的,其实是各种软件。因此,作为开发软件的软件工程师成为最炙手可热的岗位之一,来学习Java技术的人也日益增多。学习编程语言的同学都知道,Java开发语言一直以来都是世界上数一数二的开发语言,在整个互联网下也占了很大的份额。近年来,学习Java参与就业的人也在逐渐…

    2022年7月8日
    23
  • Petri网学习(四):Petri网的结构性质

    Petri网学习(四):Petri网的结构性质一 结构有界性 amp 守恒性 1 结构有界性定义 设 N P T F 为一个网 对 N 赋予任意的初始标识 M0 网 N M0 都是有界的 则称 N 为结构有界网 再回忆一下什么是有界 petri 网 在 PN P T F M0 中 库所 p 都有界 则称 PN 为有界 petri 网 区别在于是不是任意初始标识 什么是库所有界 nbsp 定理 设 A 为网 N P T F 的关联矩阵 N 是结构有界网的充分必

    2026年3月18日
    1
  • VPC网络梳理

    VPC网络梳理简介私有网络 VPC 私有网络是针对公有云的基础网络 经典网络 来定义的一种概念 VPC VirtualPriva 是公有云上自定义的逻辑隔离网络空间 是一块可我们自定义的网络空间 与我们在数据中心运行的传统网络相似 托管在 VPC 内的是我们在私有云上的服务资源 如云主机 负载均衡 云数据库等 我们可以自定义网段划分 IP 地址和路由策略等 并通过安全组和网络 ACL 等实现

    2026年3月20日
    2
  • 百度ocr的使用 – connie

    百度ocr的使用 – connie

    2026年3月15日
    2

发表回复

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

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