4.6. 使用 Spring Profiles

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

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

public interface SomeService {
    String NAME = "demo_SomeService";

    String hello(String input);
}

@Service(SomeService.NAME)
@Profile("dev")
public class SomeDevServiceBean implements SomeService {
    @Override
    public String hello(String input) {
        return "Service stub: hello " + input;
    }
}

@Service(SomeService.NAME)
@Profile("prod")
public class SomeProdServiceBean implements SomeService {
    @Override
    public String hello(String input) {
        return "Real service: hello " + input;
    }
}

如需定义一些针对特定 profile 的应用程序属性,需要在基础的 app.properties 文件所在包内创建 <profile>-app.properties 文件(对于 web 模块是 <profile>-web-app.properties)。

比如,对于 core 模块:

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

对于 web 模块:

com/company/demo/web-app.properties
com/company/demo/prod-web-app.properties

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

prod-app.properties
cuba.dbmsType = postgres
cuba.dataSourceProvider = application
cuba.dataSource.dbName = my-prod-db
cuba.dataSource.host = my-prod-host
cuba.dataSource.username = cuba
cuba.dataSource.password = cuba

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

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

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

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