https://www.baeldung.com/spring-profiles
https://maven.apache.org/guides/introduction/introduction-to-profiles.html
profile
表示环境的概念,spring framework 提供了对 profile
的支持,允许我们将 Bean 映射到不同的环境,比如:dev(开发)、test(测试)、prod(生产);
@profile 注解
@profile
注解可以将bean 映射到不同的环境,比如说我们一个在 dev 开发环境下使用的数据源配置 bean :
@Component
@Profile("dev")
public class DevDatasourceConfig
这样DevDatasourceConfig 这个 bean 只会在开发环境下被注入 bean 容器。
@profile
注解也支持 not 运算符,当我们想指定一个 bean 不在 dev 环境下时被注入,可以使用
@Component
@Profile("!dev")
public class DevDatasourceConfig
设置 profiles
有多种方式可以设置当前 profiles。
通过__
在 java Web 应用中,可以通过 web.xml 中context parameter 设置:
<context-param>
<param-name>spring.profiles.active</param-name>
<param-value>dev</param-value>
</context-param>
通过WebApplicationInitializer
WebApplicationInitializer
是 Spring 提供的一个接口,用于在基于 Servlet API 的 java Web 应用程序中以编程方式配置 ServletContext。
它允许开发者在应用启动时动态地设置 Servlet 容器的各种参数,而不需要依赖传统的 web.xml 配置文件。
@Configuration
public class MyWebApplicationInitializer
implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
servletContext.setInitParameter(
"spring.profiles.active", "dev");
}
}
JVM 参数
在项目启动时,通过 JVM 系统参数也可以设置 profile:
-Dspring.profiles.active=dev
也可以通过操作系统的环境变量来设置 profile ,比如说在 unix 系统中:
export spring_profiles_active=dev
spring profile 也可以通过 maven profile 进行设置。
比如在 pom.xml 中配置如下 profiles 属性:
<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>
上述 profiles 属性配置了两个 profile属性,id 为dev
、prod
,在 profile的 properties 属性中设置spring.profiles.active
属性。
这段配置的作用是当我们激活某个 maven profile 时,相应的spring.profiles.active
属性值会替换application.properties 中的${spring.profiles.active}
的占位符。
我们还需要在 pom.xml 中配置:
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
...
</build>
这样配置后,我们可以在 maver cli 命令中添加-P
参数来切换不同的 profiles。
<font style="color:rgb(0, 0, 0);">mvn clean package -Pprod</font>
不同方式的优先级
上边我们列出了 5 中设置 profile 的方式,这些方式生效的优先级从高到低位:
- web.xml 设置Context parameter
- WebApplicationInitializer
- JVM 系统参数
- 环境变量
- Maven profile
高优先级的设置会覆盖低优先级。
default profile
对于没有指定 profile 的所有 spring bean 属于default
profile。
我们也可以通过设置spring.profiles.default
属性来修改默认的 profile
获取当前 profile
例子
spring boot profile
spring boot 提供了对基于 profile 的配置文件的支持,可以对不同的环境(如开发、测试、生产)创建独立的配置文件,这些文件的命名格式为:
application-{profile}.properties
比如:
application-dev.properties
:用于开发环境的配置。application-prod.properties
:用于生产环境的配置。
注意,application.yml
是全局配置文件,会在所有环境下默认加载。
而特定环境配置文件中的配置会覆盖掉全局配置文件中的同名配置。
在application.yml
中可以设置当前激活的 profile:
spring:
profiles:
active: dev