Несколько файлов конфигурации Spring (по одному на профиль)

Я новичок в 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 вместо того, чтобы делать это для каждого компонента и, возможно, забывать некоторые варианты, когда новые классы добавляются позже.


person user3105453    schedule 04.08.2016    source источник


Ответы (1)


Все ваши реализации EnvironmentAwareBean снабжены аннотациями @Service.

Это означает, что все они будут обнаружены при сканировании компонентов, и, следовательно, вы получите более одного соответствующего bean-компонента. Нужно ли их аннотировать с помощью @Service?

Аннотирование каждого @Configuration аннотацией @Profile — это нормально. Другой способ в качестве образовательного упражнения — не использовать @Profile, а вместо этого аннотировать классы @Bean или Config собственной реализацией @Conditional.

person UserF40    schedule 04.08.2016
comment
Большое тебе спасибо. Я только что удалил аннотацию @Service, и теперь она работает так, как я думаю :) Я также посмотрю на аннотацию @Conditional. - person user3105453; 05.08.2016