#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;
}
}
}