http://blog.csdn.net/he90227/article/details/52981747

摘要: spring Boot使用@Profile注解可以实现不同环境下配置参数的切换,任何@Component或@Configuration注解的类都可以使用@Profile注解。 例如: @Configuration @Profile("production") public class Produc...

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中设置:

spring.profiles.active=dev,hsqldb

或者在application.yaml中设置:

spring.profiles.active:dev,hsqldb

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=XXXXXX可以是dev或者prod或者dev,prod需要注意的是:本例中是将@Profile用在Service类上,一个Service接口不能同时存在超过两个实现类,故本例中不能同时使用dev和prod。

通过不同的profile,可以有对应的资源文件application-{profile}.properties。例如,application-dev.properties内容如下:

name=JavaChen-dev

application-prod.properties内容如下:

name=JavaChen-prod

接下来进行测试。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 Profile使用的更多相关文章

  1. 从.Net到Java学习第五篇——Spring Boot &&Profile &&Swagger2

    从.Net到Java学习系列目录 刚学java不久,我有个疑问,为何用到的各种java开源jar包许多都是阿里巴巴的开源项目,为何几乎很少见百度和腾讯?不是说好的BAT吗? Spring Boot 的 ...

  2. Spring Boot - Profile配置

    Profile是什么 Profile我也找不出合适的中文来定义,简单来说,Profile就是Spring Boot可以对不同环境或者指令来读取不同的配置文件. Profile使用 假如有开发.测试.生 ...

  3. Spring boot profile 多环境配置

    1.多Profile文件 我们在主配置文件编写的时候,文件名可以是 application-{profile}.properties/yml 默认使用application.properties的配置 ...

  4. Spring Boot+Profile实现不同环境读取不同配置

    文件结构如下: 但是官方推荐放在config文件夹下. 作用: 不同环境的配置设置一个配置文件,例如:dev环境下的配置配置在application-dev.properties中.prod环境下的配 ...

  5. Spring Boot系列之-profile

    Spring Boot profile用于分离不同环境的参数配置,通过spring.profile.active参数设置使用指定的profile. 在Spring Boot中应用程序配置可以使用2种格 ...

  6. 吐血整理 20 道 Spring Boot 面试题,我经常拿来面试别人!

    面试了一些人,简历上都说自己熟悉 Spring Boot, 或者说正在学习 Spring Boot,一问他们时,都只停留在简单的使用阶段,很多东西都不清楚,也让我对面试者大失所望. 下面,我给大家总结 ...

  7. Quick Guide to Microservices with Spring Boot 2.0, Eureka and Spring Cloud

    https://piotrminkowski.wordpress.com/2018/04/26/quick-guide-to-microservices-with-spring-boot-2-0-eu ...

  8. 紧急整理了 20 道 Spring Boot 面试题,我经常拿来面试别人!

    面试了一些人,简历上都说自己熟悉 Spring Boot, 或者说正在学习 Spring Boot,一问他们时,都只停留在简单的使用阶段,很多东西都不清楚,也让我对面试者大失所望. 下面,我给大家总结 ...

  9. 20 道 Spring Boot 面试题

    转自:微信公众号:Java技术栈(id: javastack) 面试了一些人,简历上都说自己熟悉 Spring Boot, 或者说正在学习 Spring Boot,一问他们时,都只停留在简单的使用阶段 ...

随机推荐

  1. Java 基础(8)——流程控制

    上次的运算符都消化好了吗?每一天都要用到一些哦~ 以前有提到过一嘴,程序执行都是从上到下执行的,emm,学到这里,感觉这句话是对的也是错的了…… 如果都是一行一行执行下去的话,上节课的例子: 今天不上 ...

  2. 会话技术Cookie

    1.会话技术 1>什么是会话技术: 从打开一个浏览器访问某个站点,到关闭这个浏览器的整个过程,成为一次会话. 2>作用: 会话技术就是记录这次会话中客户端的状态与数据的. Cookie:数 ...

  3. svn怎么下载代码到本地

    1. 在我们安装好svn时,在指定的目录中点击鼠标右键SVN Checkout,弹出以下窗口.(在文件夹下各自建好前后台的文件夹分别check) 2. 在URL of repository:(存储库的 ...

  4. 关于移动web开发过程中的”点透“问题

    先说说故事发生的场景,举个栗子如下图: A是遮罩层,B是正常的DOM,C是B上的某个元素,这里是链接.场景是点击A的时候A消失,结果点到了C,页面发生了跳转,这显然不是咱想要的~ 下面我们来监测点击事 ...

  5. 洛谷P3960 列队(动态开节点线段树)

    题意 题目链接 Sol 看不懂splay..,看不懂树状数组... 只会暴力动态开节点线段树 观察之后不难发现,我们对于行和列需要支持的操作都是相同的:找到第\(k\)大的元素并删除,在末尾插入一个元 ...

  6. Java Struts2 (二)

    二.封装请求正文到对象中(非常重要) 1.静态参数封装 在struts.xml配置文件中,给动作类注入值.调用的是setter方法. 原因:是由一个staticParams的拦截器完成注入的. 2.动 ...

  7. 139.00.006 Git学习-标签管理Tag

    @(139 - Environment Settings | 环境配置) 一.Why 发布一个版本时,我们通常先在版本库中打一个标签(tag),这样,就唯一确定了打标签时刻的版本.将来无论什么时候,取 ...

  8. as3.2版本中中jar生成方法

    lintOptions { abortOnError false } task makeJar(type: Copy) { //删除存在的 delete 'build/libs/myjar.jar' ...

  9. Unity使Text 文字逐个出现

    Text tex; string s="Unity使Text 文字逐个出现"; //字符出现间隔 waitTime = 0.3f; // float speed=0; //方法一 ...

  10. 使用Mist部署Contract到Rinkeby以太坊网络

    本文使用MyEthWallet新建一个账号,并导入到Mist中,然后部署Contract到Rinkeby网络使用MyEthWallet新建账号的好处是除了JSON文件之外,还能得到一张它生成的pdf( ...