Внедрение условной зависимости - PullRequest
3 голосов
/ 14 апреля 2011

У меня есть приложение, использующее внедрение зависимостей на основе аннотаций для сервисов и слоев дао. Теперь требуется, чтобы какое-то условие, над которым некоторые дао работали в структурах данных памяти вместо db. Итак, я думаю о написании новых реализаций этого дао. Поскольку у службы уже есть аннотации с именами dao, я не уверен, как вставить в нее те из них, которые находятся в памяти.

Должен ли я перезаписывать БД на те, что в памяти, после инъекции, или есть другой чистый способ? Если бы я использовал XML, я бы использовал другой XML для дао в памяти.

Спасибо заранее, Аман

1 Ответ

1 голос
/ 14 апреля 2011

Если ваш класс dao в памяти существует (более точно: обнаружен только во время сканирования класса) в тех случаях, когда его следует использовать, чем вы можете @ Primary к нему.

@Primary указывает, что бину следует отдавать предпочтение, когда найдено несколько кандидатов.

Возможно, вам также стоит взглянуть на функцию Spring 3.1: Профили .

Другим способом было бы написать Конфигурацию, которая в зависимости от некоторого параметра среды возвращает правильный bean-компонент, помеченный как первичный:

/**
 * I never have tried to inject a bean in a @Configuratution and
 * return it as @Bean annotated it with @Primary, so it is an experiment 
 * I would been glad to know if it works.
 */
@Configuration
public class Switch {
    @Value("#{systemProperties.inmemmory}") 
    private boolean inMemmory;

    @Resource
    @Qualifier("normal")
    private Dao normalDao;

    @Resource
    @Qualifier("inMemmory")
    private Dao inMemoryDao;

    @Bean
    @Primary
    public Dao dao() {
        if (inMemmory) {
            return inMemory;
        } else {
           return normalDao;
        }
    }
}
...