4.6. Использование профилей Spring

Профили Spring позволяют кастомизировать приложение для работы в различном окружении. В зависимости от активного профиля можно инстанциировать различные реализации одного и того же бина, а также присваивать различные значения свойствам приложения.

Если Spring-бин имеет аннотацию @Profile, он будет инстанциирован только если указанный в аннотации профиль соответствует какому-либо активному профилю. В примере ниже SomeDevServiceBean будет использован когда активен профиль dev, а SomeProdServiceBean будет использован когда активен профиль prod:

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>-web-app.properties для 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

Специфичный для профиля файл будет загружен сразу после базового файла, поэтому объявленные в нем свойства переопределят свойства, заданные в базовом файле. В примере ниже для профиля prod задаются параметры подключения к некоторой базе данных:

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

Список активных профилей задается для приложения следующими способами:

  • В servlet context параметре spring.profiles.active в файле web.xml, например:

    <web-app ...>
    
        <context-param>
            <param-name>spring.profiles.active</param-name>
            <param-value>prod</param-value>
        </context-param>
  • В системном свойстве Java spring.profiles.active. Например, при запуске Uber JAR:

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