Birden fazla eşleşen fasulye bulunduğunda Spring isme göre nasıl otomatik tel oluşturur?


107

Aşağıdakiler gibi arayüzlerim olduğunu varsayalım:

interface Country {}
class USA implements Country {}
class UK implements Country ()

Ve bu xml yapılandırma pasajı:

<bean class="USA"/>
<bean id="country" class="UK"/>
<bean id="main" class="Main"/>

Aşağıda hangi bağımlılığın otomatik olarak kablolanacağını nasıl kontrol edebilirim? İngiltere'yi istiyorum.

class Main {
    private Country country;
    @Autowired
    public void setCountry(Country country) {
        this.country = country;
    }
}

Spring 3.0.3.RELEASE kullanıyorum.


Bir (test) ortamında "Eşsiz fasulye türü yok ..." elde ettiğimi ve geliştirme ortamımda iyi çalıştığını eklemeyi düşündüm. Eminim bir tür sınıf yolu şeyiydi, ancak ortaya çıktı, @Qualifier'ı eklerseniz, iyi çalıştı.
markthegrea

Yanıtlar:


113

Bu, Spring 3.0 kılavuzunun 3.9.3 bölümünde belgelenmiştir :

Bir yedek eşleşme için, fasulye adı varsayılan bir niteleyici değeri olarak kabul edilir.

Başka bir deyişle, varsayılan davranış, @Qualifier("country")ayarlayıcı yöntemine eklemişsinizdir.


"Fasulye adı" derken, fasulyeyi içerecek alanın adını mı kastediyorsunuz? (yani bu durumda country)
Fon Monica'nın Davası

67

@Qualifier açıklamasını kullanabilirsiniz

Gönderen burada

Niteleyicilerle ince ayar açıklama tabanlı otomatik kablolama

Türe göre otomatik kablolama birden fazla adaya yol açabileceğinden, genellikle seçim süreci üzerinde daha fazla kontrole sahip olmak gerekir. Bunu başarmanın bir yolu, Spring'in @Qualifier ek açıklamasıdır. Bu, niteleyici değerlerinin belirli bağımsız değişkenlerle ilişkilendirilmesine, tür eşleşmelerinin kümesini daraltarak her bağımsız değişken için belirli bir fasulye seçilmesine olanak tanır. En basit durumda bu, açıklayıcı bir değer olabilir:

class Main {
    private Country country;
    @Autowired
    @Qualifier("country")
    public void setCountry(Country country) {
        this.country = country;
    }
}

Bu, İngiltere'yi ABD fasulyesine bir kimlik ekleyecek ve ABD'yi istiyorsanız bunu kullanacaktır.


12

Aynı sonucu elde etmenin başka bir yolu da @Value ek açıklamasını kullanmaktır:

public class Main {
     private Country country;

     @Autowired
     public void setCountry(@Value("#{country}") Country country) {
          this.country = country;
     }
}

Bu durumda, "#{country}dize, adlandırılmış bir fasulye olarak değerlendirilen bir Bahar İfade Dili (SpEL) ifadesidir country.


mülke göre enjekte edilebilir mi? Ya ABD veya İngiltere URL'den gelen bir tür parametre ise ve parametrenin ne olduğuna bağlı olarak 2 farklı şey enjekte etmek istersem?
Kalpesh Soni

6

Ada göre çözme ile bir çözüm daha:

@Resource(name="country")

Javax.annotation paketini kullanır , bu nedenle Bahar'a özgü değildir, ancak Bahar bunu destekler.


1
ancak @Resourceyapboz modülleri nedeniyle java 11 ile kutudan çıkar çıkmaz olmayacak
Dirk Hoffmann

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.