Автоматическое подключение двух bean-компонентов, реализующих один и тот же интерфейс - как установить bean-компонент по умолчанию в autowire?

Предпосылки:

У меня есть приложение Spring 2.5 / Java / Tomcat. Существует следующий компонент, который используется во всем приложении во многих местах

public class HibernateDeviceDao implements DeviceDao

, и следующий компонент, который является новым:

public class JdbcDeviceDao implements DeviceDao

Первый компонент настроен так (все компоненты в комплект входят)


Второй (новый) компонент настраивается отдельно


    

Это приводит (конечно) к исключению при запуске сервера:

Вложенное исключение - org.springframework.beans.factory.NoSuchBeanDefinitionException: Не определен уникальный компонент типа [com.sevenp.mobile.samplemgmt.service.dao.DeviceDao]: ожидается один соответствующий компонент, но найдено 2: [deviceDao, jdbcDeviceDao]

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

@Autowired
private DeviceDao hibernateDevicDao;

, поскольку есть два бина, реализующие один и тот же интерфейс.

Вопрос:

Можно ли настроить бины так, чтобы

1. Мне не нужно вносить изменения в существующие классы, которые уже имеют HibernateDeviceDao с автопроводкой

2. все еще будучи в состоянии использовать второй (новый) компонент следующим образом:

@Autowired
@Qualifier("jdbcDeviceDao")

Т.е. Мне понадобится способ настроить bean-компонент HibernateDeviceDao в качестве bean-компонента по умолчанию для автоматического подключения, одновременно позволяя использовать JdbcDeviceDao при явном указании этого с аннотацией @Qualifier.

То, что я уже пробовал:

Я попытался установить свойство

autowire-candidate="false"

в конфигурации бина для JdbcDeviceDao:


    

, потому что в документации Spring говорится, что

Указывает, следует ли учитывать этот компонент при поиске подходящих кандидатов для удовлетворения требований автопроводки другого компонента. Обратите внимание, что это не влияет на явные ссылки по имени, которые будут разрешены, даже если указанный bean-компонент не помечен как кандидат для автоматической передачи. *

, который я интерпретировал как означающий, что Я все еще мог бы автоматически подключать JdbcDeviceDao, используя аннотацию @Qualifier, и иметь HibernateDeviceDao в качестве компонента по умолчанию. Очевидно, что моя интерпретация была неверной, поскольку это приводит к следующему сообщению об ошибке при запуске сервера:

Неудовлетворенная зависимость типа [class com.sevenp.mobile.samplemgmt.service.dao.jdbc .JdbcDeviceDao]: ожидается, что по крайней мере 1 соответствующий бин будет

из класса, в котором я пытался выполнить автоматическое подключение бина с квалификатором:

@Autowired
@Qualifier("jdbcDeviceDao")

Решение:

Предложение Скаффмана попробовать аннотацию @Resource сработало. Таким образом, для конфигурации autowire-кандидата установлено значение false для jdbcDeviceDao, и при использовании jdbcDeviceDao я обращаюсь к нему с помощью аннотации @Resource (вместо @Qualifier):

@Resource(name = "jdbcDeviceDao")
private JdbcDeviceListItemDao jdbcDeviceDao;
130
задан Kronen 4 December 2017 в 12:48
поделиться