解惑!全面解读SpringProfile的用法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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>