Autowiring dois beans implementando a mesma interface - como definir o bean padrão para autowire?

Fundo:

Eu tenho um aplicativo Spring 2.5 / Java / Tomcat. Existe o seguinte bean, que é usado em todo o aplicativo em muitos lugares

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

e o seguinte bean que é novo:

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

O primeiro bean é configurado assim (todos os beans no pacote são incluídos)

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

O segundo (novo) bean é configurado separadamente

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

Isso resulta (é claro) em uma exceção ao iniciar o servidor:

exceção aninhada é org.springframework.beans.factory.NoSuchBeanDefinitionException: Nenhum bean exclusivo do tipo [com.sevenp.mobile.samplemgmt.service.dao.DeviceDao] é definido: esperado único bean correspondente mas encontrado 2: [deviceDao, jdbcDeviceDao]

de uma classe tentando autowire o bean como este

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

porque existem dois beans implementando a mesma interface.

A questão:

É possível configurar os beans para que

1 Eu não tenho que fazer alterações nas classes existentes, que já têm oHibernateDeviceDao autowired

2 ainda sendo capaz de usar o segundo (novo) bean assim:

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

Ou seja Eu precisaria de uma maneira de configurar oHibernateDeviceDao bean como o bean padrão a ser autoperfurado, permitindo simultaneamente o uso de umJdbcDeviceDao quando explicitamente especificando assim com o@Qualifier anotação.

O que eu já tentei:

Eu tentei definir a propriedade

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

na configuração do bean para JdbcDeviceDao:

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

porque a documentação do Spring diz que

Indica se esse bean deve ou não ser considerado ao procurar candidatos correspondentes para satisfazer os requisitos de autowiring de outro bean.Observe que isso não afeta as referências explícitas por nome, o que será resolvido mesmo que o bean especificado não esteja marcado como um candidato de autowire. *

que eu interpretei para significar que eu ainda poderia autowireJdbcDeviceDao usando o@Qualifier anotação e ter oHibernateDeviceDao como bean padrão. Aparentemente, minha interpretação não estava correta, pois isso resulta na seguinte mensagem de erro ao iniciar o servidor:

Dependência insatisfeita do tipo [classe com.sevenp.mobile.samplemgmt.service.dao.jdbc.JdbcDeviceDao]: esperado pelo menos 1 bean correspondente

vindo da classe onde tentei autowiring o bean com um qualificador:

<code>@Autowired
@Qualifier("jdbcDeviceDao")
</code>
Solução:

skaffman sugestão para experimentar a anotação @Resource trabalhada. Portanto, a configuração tem candidato autowire definido como false para jdbcDeviceDao e ao usar o jdbcDeviceDao eu me refiro a ele usando a anotação @Resource (em vez de @Qualifier):

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

questionAnswers(4)

yourAnswerToTheQuestion