Spring Profiles

В этой статье рассказывается, как создавать и активировать профили Spring различными способами.

Spring Boot Profiles

Для начала рассмотрим, как создавать профили в Spring Boot и делать профиль активным с помощью файла application.properties.

За основу возьмем Spring Boot REST API приложение, написанное в статье.

Только теперь будем использовать не встроенную базу данных, а базу MySQL. Создадим в ней три схемы для трех окружений — development, test и production. Не забудьте включить соответствующую Maven-зависимость (либо можно скачать код готового приложения):

<dependency>
    <groupId>mysql</groupId> 
    <artifactId>mysql-connector-java</artifactId>
</dependency>

В нашем приложении будет соответственно три профиля. Назовем их dev, test и prod.

Активный профиль задается в файле application.properties:

spring.profiles.active=dev

Для каждого профиля создадим соотвествующий файл:

  • application-dev.properties
  • application-test.properties
  • application-prod.properties

В каждом из них будут свои настройки базы данных. Например, в файле application-test.properties они будут такими:

spring.datasource.url=jdbc:mysql://localhost:3306/test_database_name
spring.datasource.username=root
spring.datasource.password=admin

spring.jpa.hibernate.ddl-auto=create

В файле application-dev.properties они такие:

spring.datasource.url=jdbc:mysql://localhost:3306/dev_database_name
spring.datasource.username=root
spring.datasource.password=admin

spring.jpa.hibernate.ddl-auto=create

Теперь давайте запустим наше REST-приложение. Поскольку в application.properties стоит активация профиля dev, DataSource будет инициализироваться настройками файла application-dev.properties, то есть использоваться будет база данных dev_database_name. В этом можно убедиться, добавив Person в базу с помощью запроса через Postman и посмотрев, что таблица Person не пуста в базе dev_database_name. Как это делать, мы показывали в предыдущей статье.

Убедитесь, что перед запуском приложения вы создали три пустые базы MySQL:  dev_database_name, test_database_name и prod_database_name.

Теперь попробуем активировать профиль для интеграционного теста. Тесты мы писали с помощью REST-assured.

Активация профиля для тестирования

Тестировочный профиль активируется с помощью аннотации @ActiveProfiles(«test»):

@ActiveProfiles("test")
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)

public class PersonControllerTest {
	@LocalServerPort
	private int port;
	@Autowired
	private PersonRepository repository;

	@Before
	public void setup() {

		RestAssured.port = port;
	}

	@After
	public void resetDb() {
		repository.deleteAll();
		repository.flush();
	}

	@Test
	public void whenCreatePerson_thenStatus201() {

		Person person = new Person("Michail");
		
		given().log().body()
		.contentType("application/json").body(person)
		
		.when().post("/persons")
		
		.then().log().body()
				.statusCode(HttpStatus.CREATED.value());
	}

        //остальные тесты

	private Person createTestPerson(String name) {
		Person emp = new Person(name);
		return repository.saveAndFlush(emp);
	}

}

Просто, не правда ли?

Но это еще не все, далее мы рассмотрим как содавать для каждого профиля свои бины с помощью аннотаций.

Использование аннотации @Profile

Допустим, нам нужно создавать определенный бин только для определенного профиля. Для этого можно аннотировать бин с помощью @Profile. Аннотация применима как к классу, так и к методу.

Давайте аннотируем класс ExampleTestBean, экземпляр которого будет создаваться только при активном профиле test:

@Profile("test")
@Component
public class ExampleTestBean {

}

Проверим, что бин действительно создается. Мы активировали профиль test, внедрили бин ExampleTestBean и проверили, что он не нулевой:

@ActiveProfiles("test")
@RunWith(SpringRunner.class)
@SpringBootTest
public class ProfilesIntegrationTest {

    @Autowired
    Environment environment;

    @Autowired
    ExampleTestBean testBean;

    @Test
    public void testSpringProfiles() {
        for (final String profileName : environment.getActiveProfiles()) {
	    System.out.println("Currently active profile - " + profileName);
	}

	Assert.assertEquals("test", environment.getActiveProfiles()[0]);

	assertNotNull(testBean);

    }
}

Как получить активный профиль программно

Обратите внимание, что в предыдущем примере мы взяли и напечатали текущий активный профиль:

for (final String profileName : environment.getActiveProfiles()) {
    System.out.println("Currently active profile - " + profileName);
}

Environment просто внедрен с помощью @Autowire.

Цикл используется потому, что активных профилей может быть несколько. У нас он один, так что берем и печатаем самый первый.

Итог

Настройка профилей в Spring и Spring Boot оказалась легкой.

Как всегда, полный код примера доступен на GitHub.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *