Я новичок в Spring и пытаюсь извлечь выгоду из преимуществ простой обработки «профиля» Spring. Я уже работал с этим руководством: https://spring.io/blog/2011/02/14/spring-3-1-m1-introduction-profile, и теперь я хотел бы адаптировать эту концепцию к простому примеру. У меня есть два профиля: dev
и prod
. Я представляю класс @Configuration
для каждого профиля, где я могу создавать экземпляры разных bean-компонентов (соответственно реализуя общий интерфейс) в зависимости от установленного профиля.
Мои используемые в настоящее время классы выглядят так:
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: не определен квалифицирующий bean-компонент типа [EnvironmentAwareBean]: ожидается один соответствующий bean-компонент, но найдено 3: prodBean,devBean,getDevBean
Далек ли мой подход от рекомендуемой конфигурации? На мой взгляд, было бы более разумно аннотировать каждый Configuration
аннотацией @Profile
вместо того, чтобы делать это для каждого компонента и, возможно, забывать некоторые варианты, когда новые классы добавляются позже.