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

Background:

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

<code>public class HibernateDeviceDao implements DeviceDao
</code>

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

<code>public class JdbcDeviceDao implements DeviceDao
</code>

Первый компонент настроен так (все компоненты пакета включены)

<code><context:component-scan base-package="com.initech.service.dao.hibernate" />
</code>

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

<code><bean id="jdbcDeviceDao" class="com.initech.service.dao.jdbc.JdbcDeviceDao">
    <property name="dataSource" ref="jdbcDataSource">
</bean>
</code>

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

nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No unique bean of type [com.sevenp.mobile.samplemgmt.service.dao.DeviceDao] is defined: expected single matching bean but found 2: [deviceDao, jdbcDeviceDao]

из класса, пытающегося автоматически подключить боб, как это

<code>@Autowired
private DeviceDao hibernateDevicDao;
</code>

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

The question:

Is it possible to configure the beans so that

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

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

<code>@Autowired
@Qualifier("jdbcDeviceDao")
</code>

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

What I've already tried:

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

<code>autowire-candidate="false"
</code>

в конфигурации компонента для JdbcDeviceDao:

<code><bean id="jdbcDeviceDao" class="com.initech.service.dao.jdbc.JdbcDeviceDao" autowire-candidate="false">
    <property name="dataSource" ref="jdbcDataSource"/>
</bean>
</code>

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

Indicates whether or not this bean should be considered when looking for matching candidates to satisfy another bean's autowiring requirements. Note that this does not affect explicit references by name, which will get resolved even if the specified bean is not marked as an autowire candidate.*

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

Unsatisfied dependency of type [class com.sevenp.mobile.samplemgmt.service.dao.jdbc.JdbcDeviceDao]: expected at least 1 matching bean

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

<code>@Autowired
@Qualifier("jdbcDeviceDao")
</code>
Solution:

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

<code>@Resource(name = "jdbcDeviceDao")
private JdbcDeviceListItemDao jdbcDeviceDao;
</code>

Ответы на вопрос(4)

Ваш ответ на вопрос