Я новичок в Spring и стараюсь извлечь выгоду из преимуществ простой обработки профиля Spring. Я уже проработал этот урок: https://spring.io/blog/2011/02/14/spring-3-1-m1-introducing-profile, и теперь я хотел бы адаптировать эту концепцию к простому примеру. У меня два профиля: dev
и prod
. Я представляю класс @Configuration
для каждого профиля, где я могу создавать экземпляры разных бобов (реализация общего интерфейса соответственно) в зависимости от заданного профиля.Несколько конфигурационных файлов конфигурации (по одному на профиль)
Мои в настоящее время используемые классы выглядеть следующим образом:
StatusController.java
@RestController
@RequestMapping("/status")
public class StatusController {
private final EnvironmentAwareBean environmentBean;
@Autowired
public StatusController(EnvironmentAwareBean environmentBean) {
this.environmentBean = environmentBean;
}
@RequestMapping(method = RequestMethod.GET)
Status getStatus() {
Status status = new Status();
status.setExtra("environmentBean=" + environmentBean.getString());
return status;
}
}
EnvironmentAwareBean.java
public interface EnvironmentAwareBean {
String getString();
}
EnvironmentAwareBean.java
@Service
public class DevBean implements EnvironmentAwareBean {
@Override
public String getString() {
return "development";
}
}
EnvironmentAwareBean.java
@Service
public class ProdBean implements EnvironmentAwareBean {
@Override
public String getString() {
return "production";
}
}
DevConfig.java
@Configuration
@Profile("dev")
public class DevConfig {
@Bean
public EnvironmentAwareBean getDevBean() {
return new DevBean();
}
}
ProdConfig.java
@Configuration
@Profile("prod")
public class ProdConfig {
@Bean
public EnvironmentAwareBean getProdBean() {
return new ProdBean();
}
}
Запуск примера выдает это исключение во время запуска (SPRING_PROFILES_DEFAULT
установлена в dev
):
(...) UnsatisfiedDependencyException: (...) вложено исключение не является org.springframework.beans.factory.NoUniqueBeanDefinitionException: Нет квалификационной боб типа [EnvironmentAwareBean]: ожидаемый единичный бит, но найден 3: prodBean, devBean, getDevBean
Является ли мой подход далеким от рекомендуемой конфигурации? На мой взгляд, было бы целесообразнее комментировать каждый Configuration
аннотацией @Profile
вместо того, чтобы делать это для каждого компонента и, возможно, забывать о некоторых вариантах, когда новые классы будут добавлены позже.
спасибо. Я просто удалил аннотацию '@ Service', и теперь она работает так, как мне кажется, она должна :) Я также рассмотрю аннотацию' @ Conditional'. – user3105453