Фон:
У мене є програма Spring 2.5 / Java / Tomcat. Існує наступний боб, який використовується в усьому застосуванні у багатьох місцях
public class HibernateDeviceDao implements DeviceDao
і наступну нову квасолю:
public class JdbcDeviceDao implements DeviceDao
Перша квасоля налаштована так (всі боби в упаковці включені)
<context:component-scan base-package="com.initech.service.dao.hibernate" />
Другий (новий) боб налаштовується окремо
<bean id="jdbcDeviceDao" class="com.initech.service.dao.jdbc.JdbcDeviceDao">
<property name="dataSource" ref="jdbcDataSource">
</bean>
Це призводить (звичайно) до виключення при запуску сервера:
вкладений виняток - org.springframework.beans.factory.NoSuchBeanDefinitionException: Не визначено унікального бобу типу [com.sevenp.mobile.samplemgmt.service.dao.DeviceDao]: очікується одна відповідна квасоля, але знайдено 2: [deviceDao, jdbcDeviceDao]
від класу, який намагається автопроводити боб так
@Autowired
private DeviceDao hibernateDevicDao;
тому що є два боби, що реалізують один і той же інтерфейс.
Питання:
Чи можна налаштувати квасоля так
1. Мені не потрібно вносити зміни до існуючих класів, які вже мають HibernateDeviceDao
автоматичне з'єднання
2. Ще в змозі використовувати другий (новий) квасоля так:
@Autowired
@Qualifier("jdbcDeviceDao")
Тобто мені знадобиться спосіб конфігурувати HibernateDeviceDao
bean як бон за замовчуванням для автоматичного з'єднання, одночасно дозволяючи використовувати a, JdbcDeviceDao
коли явно вказується це з @Qualifier
анотацією.
Що я вже спробував:
Я спробував встановити властивість
autowire-candidate="false"
у конфігурації бобів для JdbcDeviceDao:
<bean id="jdbcDeviceDao" class="com.initech.service.dao.jdbc.JdbcDeviceDao" autowire-candidate="false">
<property name="dataSource" ref="jdbcDataSource"/>
</bean>
тому що весняна документація говорить про це
Вказує на те, чи слід враховувати цей боб під час пошуку відповідних кандидатів, щоб задовольнити вимоги до електромонтажу іншого боба. Зауважте, що це не впливає на явні посилання на ім’я, які будуть вирішені, навіть якщо вказаний боб не буде позначений як кандидат автозаправки. *
що я інтерпретував так, що я все ще можу зробити автопровід JdbcDeviceDao
за допомогою @Qualifier
анотації та мати за HibernateDeviceDao
замовчуванням боб. Мабуть, моє тлумачення було невірним, оскільки це призводить до наступного повідомлення про помилку при запуску сервера:
Незадоволена залежність типу [class com.sevenp.mobile.samplemgmt.service.dao.jdbc.JdbcDeviceDao]: очікується щонайменше 1 відповідна квасоля
виходить з класу, де я спробував автоматичне з'єднання квасолі з класифікатором:
@Autowired
@Qualifier("jdbcDeviceDao")
Рішення:
skaffman в пропозицію спробувати @Resource анотацію працював. Таким чином, у конфігурації встановлено параметр autowire-kandidat для false jdbcDeviceDao, і при використанні jdbcDeviceDao я посилаюся на нього, використовуючи анотацію @Resource (замість @Qualifier):
@Resource(name = "jdbcDeviceDao")
private JdbcDeviceListItemDao jdbcDeviceDao;