【转】Spring Boot Profile使用
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=XXX
。XXX
可以是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使用的更多相关文章
- 从.Net到Java学习第五篇——Spring Boot &&Profile &&Swagger2
从.Net到Java学习系列目录 刚学java不久,我有个疑问,为何用到的各种java开源jar包许多都是阿里巴巴的开源项目,为何几乎很少见百度和腾讯?不是说好的BAT吗? Spring Boot 的 ...
- Spring Boot - Profile配置
Profile是什么 Profile我也找不出合适的中文来定义,简单来说,Profile就是Spring Boot可以对不同环境或者指令来读取不同的配置文件. Profile使用 假如有开发.测试.生 ...
- Spring boot profile 多环境配置
1.多Profile文件 我们在主配置文件编写的时候,文件名可以是 application-{profile}.properties/yml 默认使用application.properties的配置 ...
- Spring Boot+Profile实现不同环境读取不同配置
文件结构如下: 但是官方推荐放在config文件夹下. 作用: 不同环境的配置设置一个配置文件,例如:dev环境下的配置配置在application-dev.properties中.prod环境下的配 ...
- Spring Boot系列之-profile
Spring Boot profile用于分离不同环境的参数配置,通过spring.profile.active参数设置使用指定的profile. 在Spring Boot中应用程序配置可以使用2种格 ...
- 吐血整理 20 道 Spring Boot 面试题,我经常拿来面试别人!
面试了一些人,简历上都说自己熟悉 Spring Boot, 或者说正在学习 Spring Boot,一问他们时,都只停留在简单的使用阶段,很多东西都不清楚,也让我对面试者大失所望. 下面,我给大家总结 ...
- 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 ...
- 紧急整理了 20 道 Spring Boot 面试题,我经常拿来面试别人!
面试了一些人,简历上都说自己熟悉 Spring Boot, 或者说正在学习 Spring Boot,一问他们时,都只停留在简单的使用阶段,很多东西都不清楚,也让我对面试者大失所望. 下面,我给大家总结 ...
- 20 道 Spring Boot 面试题
转自:微信公众号:Java技术栈(id: javastack) 面试了一些人,简历上都说自己熟悉 Spring Boot, 或者说正在学习 Spring Boot,一问他们时,都只停留在简单的使用阶段 ...
随机推荐
- linux创建日期文件名
linux创建文件名添加当前系统日期时间的方法 使用`date +%y%m%d` Example: mkdir `date +%y%m%d` tar cfvz /tmp/bak.`date +%y%m ...
- document.getElementsByTagName
var elems = document.forms[form_name].getElementsByTagName("INPUT"); getElementsByTagName( ...
- CentOS 7.2 安装 MySQL 5.6.24
说明:由于甲骨文公司收购了MySQL后,有将MySQL闭源的潜在风险,因此CentOS社区采用mysql的MariaDB分支的方式来避开这个风险. 所以需要先加入yum的仓库,才能利用yum来安装my ...
- Object.preventExtensions()使用技巧
Object.preventExtensions() 方法让一个对象变的不可扩展,也就是永远不能再添加新的属性. // Object.preventExtensions将原对象变的不可扩展,并且返回原 ...
- csharp:Microsoft.Ink 手写识别(HandWriting Recognition)
/* 下載: //Microsoft Windows XP Tablet PC Edition 2005 Recognizer Pack http://www.microsoft.com/zh-cn/ ...
- MySQL查询(未完结)
MySql查询 单表查询: 查询所有字段 SELECT * FROM 表名; '*' 代表所有字段 查询指定字段 SELECT 字段名1, 字段名2 FROM 表名; 按照指定条件查询记录 1. 查询 ...
- 什么是APP???APP的开发类型又分哪几种???
开发者们都知道在高端智能手机系统中有两种应用程序: 一种是基于本地(操作系统)运行的APP —-Native App: 一种是基于高端机的浏览器运行的App —-WebApp因为这些高端智能手机(Ip ...
- Ajax与jsonp
1.ajax的概念 AJAX = Asynchronous Javascript And XML (AJAX = 异步 javascript 和 xml) AJAX是一种无需重新加载整个网页的 ...
- 本地存储localStroage的用法及示例
localStorage是HTML5在在客户端存储数据的新方法,存储的数据没有时间限制. localStorage的主要API: localStorage.setItem(key,value); ...
- 安装配置postgreSQL+pgcli+pgadmin3
记录了postgreSQL数据库的完整的安装配置过程,以及postgreSQL的pgcli命令行智能提醒扩展,pgadmin3图形化管理客户端的配置安装.此postgresql是bigsql版安装详情 ...