TL; DR
@Autowired ek açıklaması, kabloları XML dosyasında (veya başka bir yolla) kendiniz yapmanız gerektiğini saklar ve sadece sizin için neyin enjekte edilmesi gerektiğini bulur ve bunu sizin için yapar.
Tam açıklama
@AutowiredEk açıklama başka bir yerde enjekte etmek ne yapılandırmaları atlamak için izin verir ve sadece sizin için yapıyor. Paketinizin com.mycompany.moviesbu etiketi XML'inize (uygulama bağlam dosyası) koymanız gerektiğini varsayarsak :
<context:component-scan base-package="com.mycompany.movies" />
Bu etiket otomatik tarama yapar. Fasulye haline gelmesi gereken her sınıfın @Component(basit fasulye için) veya @Controller(bir sunucu uygulaması kontrolü için) veya @Repository( DAOsınıflar için ) gibi doğru bir açıklama ile açıklandığı ve bu sınıfların paketin altında bir yerde olduğunu varsayarsak com.mycompany.movies, Bahar bunların hepsini bulacaktır ve her biri için bir fasulye. Bu, sınıfların 2 taramasında yapılır - ilk kez sadece fasulye olması gereken sınıfları arar ve yapması gereken enjeksiyonları eşleştirir ve ikinci taramada çekirdekleri enjekte eder. Tabii ki, çekirdeklerinizi daha geleneksel XML dosyasında veya bir @Configuration sınıfında (veya üçünün herhangi bir kombinasyonunda) tanımlayabilirsiniz .
@AutowiredBir enjeksiyon gerçekleşmesi gereken yerde açıklama Bahar söyler. Bir yönteme koyarsanız , bir fasulyenin enjekte edilmesi setMovieFindergerektiğini anlar (önek set+ @Autowiredek açıklama ile). İkinci taramada, Spring bir fasulye türünü arar MovieFinderve eğer böyle bir fasulye bulursa onu bu yönteme enjekte eder. Böyle iki fasulye bulursa, bir alacaksınız Exception. Bundan kaçınmak için Exception, @Qualifieraçıklamayı kullanabilir ve iki fasulyeden hangisinin aşağıdaki şekilde enjekte edileceğini söyleyebilirsiniz:
@Qualifier("redBean")
class Red implements Color {
// Class code here
}
@Qualifier("blueBean")
class Blue implements Color {
// Class code here
}
Veya XML'inizdeki fasulyeleri bildirmeyi tercih ederseniz, şöyle bir şey olur:
<bean id="redBean" class="com.mycompany.movies.Red"/>
<bean id="blueBean" class="com.mycompany.movies.Blue"/>
In @Autowiredbeyanı, ayrıca eklemeniz gerekir @Qualifierenjekte etmek için iki renk fasulye hangi anlatmak için:
@Autowired
@Qualifier("redBean")
public void setColor(Color color) {
this.color = color;
}
İki ek açıklama ( @Autowiredve @Qualifier) kullanmak istemiyorsanız @Resource, bu ikisini birleştirmek için kullanabilirsiniz :
@Resource(name="redBean")
public void setColor(Color color) {
this.color = color;
}
@Resource(Bu yanıtla ilgili ilk yorumunda bu konuda biraz ek verileri okuyabilir) sana iki ek açıklamaları kullanımını yedek ve bunun yerine sadece birini kullanın.
Sadece iki yorum daha ekleyeceğim:
- İyi örnek kullanmak olacaktır
@Injectyerine @Autowiredo İlkbahar özgü değildir ve çünkü bir parçası JSR-330standardı .
- Bir başka iyi uygulama koymak olurdu
@Inject/ @Autowiredyerine bir yöntemin bir yapıcı. Bir kurucuya koyarsanız, uygulamayı başlatmaya çalıştığınızda NullPointerExceptionve fasulyeyi gerçekten kullanmanız gerektiğinde kaçındığınızda, enjekte edilen fasulyelerin boş olmadığını ve hızlı bir şekilde başarısız olmadığını doğrulayabilirsiniz .
Güncelleme : Resmi tamamlamak için sınıfla ilgili yeni bir soru oluşturdum @Configuration.