Spring Boot使用@Profile
注解可以实现不同环境下配置参数的切换,任何@Component
或@Configuration
注解的类都可以使用@Profile
注解。
例如:
@Configuration @Profile("production") public class ProductionConfiguration { // ... }
通常,一个项目中可能会有多个profile场景,例如下面为test场景:
@Configuration @Profile("test") public class TestConfiguration { // ... }
在存在多个profile情况下,你可以使用spring.profiles.active
来设置哪些profile被激活。spring.profiles.include
属性用来设置无条件的激活哪些profile。
例如,你可以在application.properties
中设置:
或者在application.yaml
中设置:
spring.profiles.active
属性可以通过命令行参数或者资源文件来设置,其查找顺序,请参考Spring Boot特性。
自定义Profile注解
@Profile
注解需要接受一个字符串,作为场景名。这样每个地方都需要记住这个字符串。Spring的@Profile
注解支持定义在其他注解之上,以创建自定义场景注解。
@Target({ElementType.TYPE, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Profile("dev") public @interface Dev { }
这样就创建了一个@Dev
注解,该注解可以标识bean使用于@Dev
这个场景。后续就不再需要使用@Profile("dev")
的方式。这样即可以简化代码,同时可以利用IDE的自动补全:)
多个Profile例子
下面是一个例子:
package com.javachen.example.service; public interface MessageService { String getMessage(); }
对于MessageService接口,我们可以有生产和测试两种实现:
package com.javachen.example.service; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Profile; import org.springframework.stereotype.Component; @Component @Profile({ "dev" }) public class HelloWorldService implements MessageService{ @Value("${name:World}") private String name; public String getMessage() { return "Hello " + this.name; } }
package com.javachen.example.service; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Profile; import org.springframework.stereotype.Component; @Component @Profile({ "prod" }) public class GenericService implements MessageService { @Value("${hello:Hello}") private String hello; @Value("${name:World}") private String name; @Override public String getMessage() { return this.hello + " " + this.name; } }
Application类为:
@SpringBootApplication public class Application implements CommandLineRunner { private static final Logger logger = LoggerFactory.getLogger(Application.class); @Autowired private MessageService messageService; @Override public void run(String... args) { logger.info(this.messageService.getMessage()); if (args.length > 0 && args[0].equals("exitcode")) { throw new ExitException(); } } public static void main(String[] args) throws Exception { SpringApplication.run(Application.class, args); } }
实际使用中,使用哪个profile由spring.profiles.active
控制,你在resources/application.properties
中定义spring.profiles.active=XXX
,或者通过-Dspring.profiles.active=XXX
。XXX
可以是dev
或者prod
或者dev,prod
。需要注意的是
:本例中是将@Profile
用在Service类上,一个Service接口不能同时存在超过两个实现类,故本例中不能同时使用dev和prod。
通过不同的profile,可以有对应的资源文件application-{profile}.properties
。例如,application-dev.properties
内容如下:
name=JavaChen-dev
application-prod.properties
内容如下:
接下来进行测试。spring.profiles.active=dev
时,运行Application类,查看日志输出。
2016-02-22 15:45:18,470 [main] INFO com.javachen.example.Application - Hello JavaChen-dev
spring.profiles.active=prod
时,运行Application类,查看日志输出。
2016-02-22 15:47:21,270 [main] INFO com.javachen.example.Application - Hello JavaChen-prod
logback配置多Profile
在resources目录下添加logback-spring.xml,并分别对dev和prod进行配置:
<?xml version="1.0" encoding="UTF-8"?> <configuration> <!--<include resource="org/springframework/boot/logging/logback/base.xml" />--> <springProfile name="dev"> <logger name="com.javachen.example" level="TRACE" /> <appender name="LOGFILE" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> </springProfile> <springProfile name="prod"> <appender name="LOGFILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <File>log/server.log</File> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <FileNamePattern>log/server_%d{yyyy-MM-dd}.log.zip</FileNamePattern> </rollingPolicy> <layout class="ch.qos.logback.classic.PatternLayout"> <pattern>%date [%thread] %-5level %logger{80} - %msg%n</pattern> </layout> </appender> </springProfile> <root level="info"> <appender-ref ref="LOGFILE" /> </root> <logger name="com.javachen.example" level="DEBUG" /> </configuration>
这样,就可以做到不同profile场景下的日志输出不一样。
maven中的场景配置
使用maven的resource filter可以实现多场景切换。
<profiles> <profile> <id>prod</id> <activation> <activeByDefault>true</activeByDefault> </activation> <properties> <build.profile.id>prod</build.profile.id> </properties> </profile> <profile> <id>dev</id> <properties> <build.profile.id>dev</build.profile.id> </properties> </profile> </profiles> <build> <filters> <filter>application-${build.profile.id}.properties</filter> </filters> <resources> <resource> <filtering>true</filtering> <directory>src/main/resources</directory> </resource> </resources> </build>
这样在maven编译时,可以通过-P
参数指定maven profile即可。
总结
使用Spring Boot的Profile注解可以实现多场景下的配置切换,方便开发中进行测试和部署生产环境。
本文中相关代码在github上面。
相关推荐
综上,《Spring Boot参考指南》覆盖了Spring Boot的各个方面,无论是初学者还是经验丰富的开发者,都能从中受益匪浅,快速掌握Spring Boot的使用技巧和最佳实践。这份中文翻译版本的出现,无疑为国内的Spring Boot...
在 Profile 模式中,我们可以使用 @Profile 注解来标注配置类,并使用 spring.profiles.active 属性来激活当前的 Profile。同时,我们也可以使用 @ConditionalOnProfile 注解来标注条件性配置。 四、日志处理 日志...
此外,Spring Boot 支持使用 Profile 功能,可以根据不同的运行环境加载不同的配置。 最后,测试也是 Spring Boot 的强项之一。它提供了 `SpringBootTest` 和 `WebMvcTest` 等注解,方便编写集成测试和控制器测试,...
- **简化配置**:在没有使用 Spring Boot 时,构建项目通常需要大量的 XML 配置文件,这不仅使得项目结构变得复杂,而且在配置过程中容易出错。 - **减少依赖冲突**:整合第三方框架时往往需要手动配置 JAR 包,这会...
为了更好地适应不同的部署环境,Spring Boot提供了多种配置特性,包括外化配置、配置随机值、访问命令行属性、使用YAML代替Properties文件、特定的Profile属性、属性占位符等。YAML是一种标记语言,它易于阅读,适用...
2. **Profile切换**:通过`spring.profiles.active`属性,可以在不同环境下切换配置。 3. **外部化配置**:允许将配置存储在单独的文件或环境变量中,提高灵活性。 **五、Spring Boot 集成Spring MVC** 1. **配置...
- **使用Spring Boot Maven插件**:指导如何使用Spring Boot的Maven插件进行构建。 - **Gradle**:讲解如何使用Gradle构建工具。 - **Ant**:虽然较少提及,但也支持使用Ant进行构建。 - **Starters**:介绍...
1.2.2 使用Spring Initializr初始化Spring Boot项目 10 1.3 小结 18 第2章 开发第一个应用程序 19 2.1 运用Spring Boot 19 2.1.1 查看初始化的Spring Boot新项目 21 2.1.2 Spring Boot项目构建过程解析 ...
- **使用Spring Boot**:介绍Spring Boot的基本概念、特性及其应用场景。 - **了解Spring Boot特性**:包括Spring Boot如何自动配置、集成外部系统等。 - **迁移到生产环境**:讨论如何将开发中的应用部署到生产环境...
- **Kotlin 支持**:Spring Boot 2.0 开始正式支持 Kotlin,允许开发者使用 Kotlin 编写 Spring Boot 应用。 - **Spring Data JDBC**:Spring Data JDBC 是一个新的模块,提供了一种轻量级的数据访问层,替代了传统...
- **使用外部配置文件**:Spring Boot 支持使用外部配置文件,如 `application-{profile}.properties`,可以在不同的环境中加载不同的配置。这种方式非常适合于多环境部署的应用程序。 ##### 2.8 使用 Spring Boot ...
首先,介绍部分为读者提供了文档的基本结构和获取帮助的途径,以及使用Spring Boot的初步步骤,包括系统要求、安装指南和如何开始开发第一个Spring Boot应用。系统要求部分讨论了Servlet容器的配置,而安装指南则...
**Spring Boot 常用注解详解** Spring Boot以其简洁的配置、快速的启动和集成众多优秀框架的能力,成为Java开发领域中的热门选择。在Spring Boot应用中,注解起着至关重要的作用,它们简化了配置,使得代码更加简洁...
Spring Boot 的应用程序可以通过 Maven 打包成一个可执行的 jar 包,开发者可以使用 java -jar 命令来执行该应用程序。这使得应用程序的部署变得非常方便。 Spring Boot 是一个功能强大且灵活的框架,它可以帮助...
- **属性值**:Spring Boot 允许使用外部配置文件来存储应用配置信息。 - **访问配置信息**:可以通过多种方式访问这些配置信息。 - **Application Properties**:Spring Boot 支持将配置文件中的属性映射到 Java...
2. 配置管理学习如何编写配置文件(如application.properties或application.yml),管理应用的各种属性,并利用Spring Boot的Profile功能实现不同环境下的配置切换。 3. 静态资源与模板引擎整合演示如何整合静态资源...
1.2.2 使用Spring Initializr初始化Spring Boot项目 10 1.3 小结 18 第2章 开发第一个应用程序 19 2.1 运用Spring Boot 19 2.1.1 查看初始化的Spring Boot新项目 21 2.1.2 Spring Boot项目构建过程...
本文将详细探讨如何在Spring Boot的多模块项目中管理和使用不同的配置文件,以实现低耦合的设计。 首先,了解Spring Boot的默认配置机制。Spring Boot的核心理念是简化配置,它通过`application.properties`或`...
- **使用 Spring Boot**:本节主要介绍 Spring Boot 的核心概念和功能,以及如何利用这些功能来简化开发过程。 #### 二、Spring Boot 入门指南 - **Spring Boot 简介**:Spring Boot 是一种基于 Spring Framework ...