解惑!全面解读SpringProfile的用法

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

解惑!全⾯解读SpringProfile的⽤法⼀、简介

Profile的意思是配置,对于应⽤程序来说,不同的环境需要不同的配置。

⽐如:

开发环境,应⽤需要连接⼀个可供调试的数据库单机进程

⽣产环境,应⽤需要使⽤正式发布的数据库,通常是⾼可⽤的集群

测试环境,应⽤只需要使⽤内存式的模拟数据库

Spring框架提供了多profile的管理功能,我们可以使⽤profile功能来区分不同环境的配置。

⼆、区分Bean对象

⾸先,我们先看看如何基于Profile来定义⼀个Bean。

通过@Profile注解可以为⼀个Bean赋予对应的profile名称,如下:

@Component

@Profile("dev")

public class DevDatasourceConfig

上⾯的DevDatasourceConfig被定义为 profile=dev,于是该Bean只会在dev(开发环境)模式下被启⽤。

如果需要定义为⾮dev环境,可以使⽤这样的形式:

@Component

@Profile("!dev")

public class DevDatasourceConfig

XML风格配置

上⾯的例⼦也可以使⽤XML配置⽂件达到同样的⽬的,如下:

<beans profile="dev">

<bean id="devDatasourceConfig"

class="org.baeldung.profiles.DevDatasourceConfig" />

</beans>

读取Profile

通过ConfigurableEnvironment这个Bean 可以获得当前的Profile,如下:

public class ProfileManager {

@Autowired

Environment environment;

public void getActiveProfiles() {

for (final String profileName : environment.getActiveProfiles()) {

System.out.println("Currently active profile - " + profileName);

}

}

}

三、设置Profile

接下来,为了让容器"仅仅注册那些所需要的Bean",我们需要通过⼀些⼿段来设置当前的profile。

有很多⽅法可以达到这个⽬的,下⾯⼀⼀介绍。

3.1 WebApplicationInitializer接⼝

在Web应⽤程序中,通过WebApplicationInitializer可以对当前的ServletContext进⾏配置。

如下,通过注⼊spring.profiles.active变量可以为Spring上下⽂指定当前的 profile:

@Configuration

public class MyWebApplicationInitializer

implements WebApplicationInitializer {

@Override

public void onStartup(ServletContext servletContext) throws ServletException {

servletContext.setInitParameter(

"spring.profiles.active", "dev");

}

}

3.2 通过 web.xml定义

与上⾯的⽅法类似,在web.xml中通过context-param元素也可以设置profile。

但前提是当前应⽤程序使⽤了xml的配置⽂件风格,如下:

<context-param>

<param-name>contextConfigLocation</param-name>

<param-value>/WEB-INF/app-config.xml</param-value>

</context-param>

<context-param>

<param-name>spring.profiles.active</param-name>

<param-value>dev</param-value>

</context-param>

3.3 JVM启动参数

通过Java程序启动参数同样可以对profile进⾏设定,如下:

java -jar application.jar -Dspring.profiles.active=dev

spring-boot-maven-plugin插件也⽀持设定profile,其原理也是通过启动参数实现,可以

3.4 环境变量

在Unix/Linux环境中,可以通过环境变量注⼊profile的值:

export spring_profiles_active=dev

java -jar application.jar

3.5 application.properties

可以在application.properties配置⽂件中指定spring.profiles.active属性:

spring.profiles.active=dev

SpringBoot默认会加载并读取该配置,当发现为profile=dev时,会同时关联加载application-dev.properties这个配置。

这种⽅式⾮常简单,可以实现对不同环境采⽤单独的配置⽂件进⾏隔离。

3.6 Maven Profile

Maven本⾝也提供了Profile的功能,可以通过Maven的Profile配置来指定Spring的Profile。

这种做法稍微有点复杂,需要先在pom.xml中设定不同的 maven profile,如下:

<profiles>

<profile>

<id>dev</id>

<activation>

<activeByDefault>true</activeByDefault>

</activation>

<properties>

<spring.profiles.active>dev</spring.profiles.active>

</properties>

</profile>

<profile>

<id>prod</id>

<properties>

<spring.profiles.active>prod</spring.profiles.active>

</properties>

</profile>

</profiles>

这⾥,分别声明了dev和prod两个profile,每个profile都包含了⼀个spring.profiles.active属性,这个属性⽤来注⼊到 Spring中的profile⼊参。在SpringBoot的配置⽂件application.properties中,需要替换为这个maven传⼊的property:

## 使⽤Maven的属性进⾏替换

spring.profiles.active=@spring.profiles.active@

接下来,需要让Maven在打包时能将application.properties进⾏过滤处理,同时替换掉变量,需编辑pom.xml如下:

<build>

<resources>

<resource>

<directory>src/main/resources</directory>

<filtering>true</filtering>

</resource>

</resources>

</build>

相关文档
最新文档