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
@Autowired
Ek 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.movies
bu 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
( DAO
sı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 .
@Autowired
Bir enjeksiyon gerçekleşmesi gereken yerde açıklama Bahar söyler. Bir yönteme koyarsanız , bir fasulyenin enjekte edilmesi setMovieFinder
gerektiğini anlar (önek set
+ @Autowired
ek açıklama ile). İkinci taramada, Spring bir fasulye türünü arar MovieFinder
ve 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
, @Qualifier
açı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 @Autowired
beyanı, ayrıca eklemeniz gerekir @Qualifier
enjekte 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 ( @Autowired
ve @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
@Inject
yerine @Autowired
o İlkbahar özgü değildir ve çünkü bir parçası JSR-330
standardı .
- Bir başka iyi uygulama koymak olurdu
@Inject
/ @Autowired
yerine bir yöntemin bir yapıcı. Bir kurucuya koyarsanız, uygulamayı başlatmaya çalıştığınızda NullPointerException
ve 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
.