Arka fon:
Spring 2.5 / Java / Tomcat uygulamam var. Birçok yerde uygulama boyunca kullanılan aşağıdaki fasulye vardır
public class HibernateDeviceDao implements DeviceDao
ve yeni olan aşağıdaki fasulye:
public class JdbcDeviceDao implements DeviceDao
İlk fasulye yapılandırıldı (paketteki tüm fasulye dahil)
<context:component-scan base-package="com.initech.service.dao.hibernate" />
İkinci (yeni) fasulye ayrı olarak yapılandırılır
<bean id="jdbcDeviceDao" class="com.initech.service.dao.jdbc.JdbcDeviceDao">
<property name="dataSource" ref="jdbcDataSource">
</bean>
Bu, sunucuyu başlatırken (elbette) bir istisna oluşturur:
yuvalanmış istisna org.springframework.beans.factory.NoSuchBeanDefinitionException: Tek bir fasulye türü [com.sevenp.mobile.samplemgmt.service.dao.Devicedao] tanımlandı: beklenen tek eşleşen fasulye ama 2 bulundu: [devicedao, jdbcDevicedao]
fasulyeyi böyle otomatik olarak bağlamaya çalışan bir sınıftan
@Autowired
private DeviceDao hibernateDevicDao;
çünkü aynı arayüzü uygulayan iki tane fasulye var.
Soru:
Fasulyeleri şu şekilde yapılandırmak mümkün mü?
1. Halihazırda otomatik HibernateDeviceDao
kablolu olan mevcut sınıflarda değişiklik yapmak zorunda değilim
2. hala ikinci (yeni) fasulyeyi şu şekilde kullanabilmek:
@Autowired
@Qualifier("jdbcDeviceDao")
Yani, HibernateDeviceDao
fasulyeyi otomatik olarak bağlanacak varsayılan fasulye olarak yapılandırmanın bir yoluna ihtiyacım olacaktı , aynı anda açıklamanın ek açıklama JdbcDeviceDao
ile belirtildiği zaman kullanılmasına izin vereceğim @Qualifier
.
Zaten denedim:
Özelliği ayarlamayı denedim
autowire-candidate="false"
JdbcDevicedao için fasulye konfigürasyonunda:
<bean id="jdbcDeviceDao" class="com.initech.service.dao.jdbc.JdbcDeviceDao" autowire-candidate="false">
<property name="dataSource" ref="jdbcDataSource"/>
</bean>
çünkü Bahar belgeleri
Başka bir fasulyenin otomatik kablolama gereksinimlerini karşılamak için eşleşen adaylar ararken bu fasulyenin dikkate alınıp alınmayacağını belirtir. Bunun, belirtilen fasulye otomatik tel adayı olarak işaretlenmemiş olsa bile çözümlenecek ada göre açık referansları etkilemediğini unutmayın. *
ki JdbcDeviceDao
bu @Qualifier
açıklamayı kullanarak autowire yapabileceğimi ve HibernateDeviceDao
varsayılan fasulye olarak kullanabileceğimi ifade ettim . Görünüşe göre benim yorumum doğru değildi, çünkü bu sunucuyu başlatırken aşağıdaki hata mesajıyla sonuçlanır:
[Class com.sevenp.mobile.samplemgmt.service.dao.jdbc.JdbcDevicedao] türünün tatminsiz bağımlılığı: en az 1 eşleşen fasulye bekleniyor
fasulye bir niteleyici ile otomatik kablolama denedim sınıftan geliyor:
@Autowired
@Qualifier("jdbcDeviceDao")
Çözüm:
skaffman'ın @Resource ek açıklamasını deneme önerisi çalıştı. Yani yapılandırma autowire-aday jdbcDevicedao için false olarak ayarlanmış ve jdbcDevicedao kullanırken @Resource ek açıklamasını (@Qualifier yerine) kullanarak başvuruyorum:
@Resource(name = "jdbcDeviceDao")
private JdbcDeviceListItemDao jdbcDeviceDao;