SORU
10 Mayıs 2012, PERŞEMBE


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
10 Mayıs 2012, PERŞEMBE


@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;

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Diogo Oliveira

    Diogo Olivei

    4 HAZİRAN 2006
  • Juan Carlos Candela Bordera

    Juan Carlos

    4 Mart 2009
  • Make:

    Make:

    23 Mart 2006