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
文件,比如:
com/company/demo/app.properties
com/company/demo/prod-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