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 HibernateDeviceDaokablolu olan mevcut sınıflarda değişiklik yapmak zorunda değilim
2. hala ikinci (yeni) fasulyeyi şu şekilde kullanabilmek:
@Autowired
@Qualifier("jdbcDeviceDao")
Yani, HibernateDeviceDaofasulyeyi 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 JdbcDeviceDaoile 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 JdbcDeviceDaobu @Qualifieraçıklamayı kullanarak autowire yapabileceğimi ve HibernateDeviceDaovarsayı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;