2016-08-04 2 views
1

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

ответ

2

Все ваши примечания EnvironmentAwareBean аннотированы @Service.

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

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

+0

спасибо. Я просто удалил аннотацию '@ Service', и теперь она работает так, как мне кажется, она должна :) Я также рассмотрю аннотацию' @ Conditional'. – user3105453