Внедрение условной зависимости

#xml #spring #dependency-injection #annotations #conditional

#xml #spring #внедрение зависимости #аннотации #условные операторы

Вопрос:

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

Должен ли я перезаписывать файлы базы данных на файлы в памяти после внедрения или есть другой чистый способ? Если бы я использовал xml, я бы использовал другой xml для in-memory dao.

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

Ответ №1:

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

@Primary указывает, что компоненту следует отдать предпочтение при нахождении нескольких кандидатов.

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

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

 /**
 * 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;
        }
    }
}