4.6. 使用 Spring Profiles

最低版本7.2

使用 Spring profile 可以对应用程序在不同运行环境做定制化。根据生效的 profile 不同,可以对同一个 bean 的不同实现做实例化,并且可以设置不同的应用程序属性值。

如果一个 Spring bean 有 @Profile 注解,则只会在匹配到相应的生效 profile 时才会做实例化。下面的例子中,SomeDevServiceBean 会在 dev profile 生效时使用; SomeProdServiceBean 会在 prod profile 生效时使用:

  1. public interface SomeService {
  2. String NAME = "demo_SomeService";
  3. String hello(String input);
  4. }
  5. @Service(SomeService.NAME)
  6. @Profile("dev")
  7. public class SomeDevServiceBean implements SomeService {
  8. @Override
  9. public String hello(String input) {
  10. return "Service stub: hello " + input;
  11. }
  12. }
  13. @Service(SomeService.NAME)
  14. @Profile("prod")
  15. public class SomeProdServiceBean implements SomeService {
  16. @Override
  17. public String hello(String input) {
  18. return "Real service: hello " + input;
  19. }
  20. }

如需定义一些针对特定 profile 的应用程序属性,需要在基础的 app.properties 文件所在包内创建 <profile>-app.properties 文件,比如:

  1. com/company/demo/app.properties
  2. com/company/demo/prod-app.properties

针对特定 profile 的配置文件会在基础的配置文件之后加载,所以其中的应用程序属性会覆盖基础配置文件中的属性。下面例子中,我们针对 prod profile 定义了指定数据库的连接:

prod-app.properties

  1. cuba.dbmsType = postgres
  2. cuba.dataSourceProvider = application
  3. cuba.dataSource.dbName = my-prod-db
  4. cuba.dataSource.host = my-prod-host
  5. cuba.dataSource.username = cuba
  6. cuba.dataSource.password = cuba

生效的 profile 列表可以通过两种方式为应用程序设置:

  • web.xml 文件内的 spring.profiles.active servlet 上下文参数中,示例:

    1. <web-app ...>
    2. <context-param>
    3. <param-name>spring.profiles.active</param-name>
    4. <param-value>prod</param-value>
    5. </context-param>
  • 使用 spring.profiles.active Java 系统属性。比如,当运行 Uber JAR 时:

    1. java -Dspring.profiles.active=prod -jar app.jar