Как использовать полиморфизм в Spring?

362
12 августа 2017, 02:11

Есть несколько вариантов реализации DAO интерфейса. Один из компонентов может принимать в качестве параметра в конструктор этот интерфейс. Но как мне определить для спринга какую реализацию использовать?

public interface DAO {
    void add(Item item);
    Item getItem(int id);
}
public class DAOMemory implements DAO {
    private final List<Item> memory;
    public DAOMemory() {
        memory = new ArrayList<>(100);
    }
}
public class DAOJdbc implements DAO {
    @Autowired
    public DAOJdbc(final PropertiesLoader properties) {
        this.properties = properties;
    }
}

И класс который использует DAO :

@Component
public class UserManager {
    private final DAO dao;
    //Вот тут проблема. Не понятно какой DAO я собираюсь использовать.
    @Autowired
    public UserStore(final DAO dao) {
        this.dao = dao;
    }
        ...
}

Как как без костылей дать понять Spring, какую реализацию я хочу использовать в каждом конкретном случае? И соответствует ли вообще такой стиль написания кода этому фраемворку?

Answer 1

Вы можете использовать аннотацию @Qualifier с указанием именем бина:

@Component
public class UserManager {
    private final DAO dao;
    @Autowired
    @Qualifier("daoJdbc") 
    public UserStore(final DAO dao) {
        this.dao = dao;
    }
    ...
}

И в конфигурации контекста этот бин определить:

<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    ...
    <bean id="daoJdbc" class="com.example.DAOJdbc" />
</beans>
READ ALSO
почему объект а2 не видит функцию a2.receivedD(a.getD());

почему объект а2 не видит функцию a2.receivedD(a.getD());

Для начала прогнали бы этот код в любой IDE, а потом уже писали бы сюдаИ у вас опечатка в названии метода receivedD в DImp2

247
Как правильно получить время?

Как правильно получить время?

Использую библиотеку Volley, получаю с сервера дату в виде строки

295
Проверка версии Zabbix Java Gateway

Проверка версии Zabbix Java Gateway

Добрый день! Как узнать версию zabbix-java-gateway? Пробовал через команду:

306
webElement.getText() как забрать нужный элемент

webElement.getText() как забрать нужный элемент

Пишу автотест, который проверяет некое поле на сайте, на соответствиеВсе работает нормально, но: обычно обращаюсь к какому-либо элементу...

246