Varsayılan fasulye autowire olarak nasıl iki fasulye aynı arayüzü uygulayan Autowiring -?
Arka plan:
Tomcat application/2.5/Bahar Java var. Birçok yerde uygulama boyunca kullanılan aşağıdaki bean var
public class HibernateDeviceDao implements DeviceDao
ve yeni olan aşağıdaki bean:
public class JdbcDeviceDao implements DeviceDao
İlk fasulye çok yapılandırılmış (paketinde tüm fasulye dahil)
<context:component-scan base-package="com.initech.service.dao.hibernate" />
(Yeni) ikinci fasulye ayrı ayrı yapılandırılır
<bean id="jdbcDeviceDao" class="com.initech.service.dao.jdbc.JdbcDeviceDao">
<property name="dataSource" ref="jdbcDataSource">
</bean>
Sunucu başlatılırken bir istisna bu sonuç (elbette):
içe özel org.springframework.fasulye.fabrika.NoSuchBeanDefinitionException: türün benzersiz bean [com.sevenp.mobil.samplemgmt.hizmet.dao.DeviceDao] tanımlanır: tek eşleşen fasulye ama 2 buldum bekleniyor: [deviceDao, jdbcDeviceDao]
sınıfa böyle bean autowire için çalışıyor
@Autowired
private DeviceDao hibernateDevicDao;
iki fasulye aynı arayüz uygulama var çünkü.
Soru:
Fasulye biçimde mümkün
1.Zaten HibernateDeviceDao
autowired olan mevcut sınıflar, değişiklik yok
2.hala böyle (yeni) ikinci bean kullanabilme:
@Autowired
@Qualifier("jdbcDeviceDao")
I. e. ben ne yapmalıyım bir yol yapılandırmak için HibernateDeviceDao
fasulye olarak varsayılan bean için autowired, aynı anda sağlayan kullanım JdbcDeviceDao
açıkça belirtmek ile @Qualifier
ek açıklama.
Ben zaten denedim ne var:
Bu özellik ayarı denedim
autowire-candidate="false"
JdbcDeviceDao için yapılandırma: fasulye
<bean id="jdbcDeviceDao" class="com.initech.service.dao.jdbc.JdbcDeviceDao" autowire-candidate="false">
<property name="dataSource" ref="jdbcDataSource"/>
</bean>
Bahar belgeleri söylüyor çünkü
Olup olmadığını gösterir ya da bu fasulye düşünülmelidir değil eşleşen adaylar için başka bir fasulye tatmin etmenin peşinde autowiring gereksinimleri.Bu açık etkileyeceğini unutmayın belirtilen bile çözülecek olan adı, referanslar fasulye autowire adayı olarak belirgin değil*.
hala JdbcDeviceDao
@Qualifier
annotation kullanarak autowire olabilir anlamına için yorumladım ve HibernateDeviceDao
varsayılan fasulye var. Görünüşe göre benim yorumum bu sunucu başlatma sırasında aşağıdaki hata iletisini sonuçları olarak doğru değil ki:
Tür bağımlılık [sınıf com.tatminsiz sevenp.mobil.samplemgmt.hizmet.dao.bulunmaktaydı.JdbcDeviceDao]: en az 1 fasulye . eşleşen bekleniyor
bir niteleyici ile fasulye autowiring denedim nerede sınıfından geliyor:
@Autowired
@Qualifier("jdbcDeviceDao")
Çözüm:
@Kaynak açıklama denemek için 37* suggestion *çalıştı. Yapılandırma autowire-aday jdbcDeviceDao için yanlış ayarlanmış ve jdbcDeviceDao kullanırken @Kaynak açıklama (yerine @Niteleyici) kullanarak bakın:
@Autowired
@Resource(name = "jdbcDeviceDao")
private JdbcDeviceListItemDao jdbcDeviceDao;
CEVAP
@Primary
, yani Hazırda DAO sınıfı (HibernateDeviceDao
@Repository
kullandığınız varsayarak) işaretleme öneririm:
@Primary
@Repository
public class HibernateDeviceDao implements DeviceDao
Bu şekilde 33* *diğer bean gerek ile varsayılan autowire bu candididate olarak seçilmiş olacak.
Ayrıca, @Autowired @Qualifier
, daha şık belirli fasulye toplamak için @Resource
kullanılabilir kullanmak yerine, yani
@Resource(name="jdbcDeviceDao")
DeviceDao deviceDao;
Nasıl varsayılan olarak phpstorm ekran...
Nasıl ek açıklamalar kullanılarak yapı...
Nasıl varsayılan olarak bir radyo düğm...
Fasulye başlatma tamamlandıktan sonra ...
Nasıl bir Liste İlkbaharda fasulye tan...