28

Hangisi daha doğru?@Outowired ek açıklama - özellik veya yöntem üzerinde nereye gitmek gerekiyor?

Bu, (yöntemle ilgili Otomatikleştirilmiş ek açıklama ile birlikte)?

@Controller 
public class MyController 
{ 
    private MyDao myDao; 

    @Autowired 
    public MyController(MyDao myDao) 
    { 
     this.myDao = myDao; 
    } 

Bu (@Otomatik kablolu açıklama ile birlikte)?

@Controller 
public class MyController 
{ 
    @Autowired 
    private MyDao myDao; 

    public MyController(MyDao myDao) 
    { 
     this.myDao = myDao; 
    } 

@Outowired ek açıklama nereye gitmeli? O autowired seyi çünkü

cevap

47

the Javadoc for Autowired göre, açıklama "yapıcı, alan, ayarlayıcı yöntem ya da yapılandırma yöntemi" de kullanılabilir. Daha fazla bilgi için the full documentation'a bakın.

@Controller 
public class MyControllear { 
    private final MyDao myDao; 

    @Autowired 
    public MyController(MyDao myDao) { 
     this.myDao = myDao; 
    } 

Yapıcı enjeksiyon ayrıca bağlıdır kodu olmadan bir birim test sınıfını test etmenizi sağlar: myDao alan nihai olarak işaretlenebilir çünkü

Ben şahsen, ilk seçeneği (kurucu enjeksiyon) tercih Bahar. Alan enjeksiyonu ile

@Controller 
public class MyControllear { 
    @Autowired 
    private MyDao myDao; 

    MyController() { 
    } 

, Bahar ardından, nesne oluşturmak alanlar enjeksiyon için işaretlenmiş güncellenecektir:

İkinci seçenek daha iyi olarak yazılabilir olacaktır. Bir veya başka bir seçim yapmak zorunda değilsiniz

@Controller 
public class MyControllear { 
    private MyDao myDao; 

    MyController() { 
    } 

    @Autowired 
    public void setMyDao(MyDao myDao) { 
     this.myDao = myDao; 
    } 

: Eğer söz etmedi

Seçeneklerden biri (ayarlayıcı enjeksiyon) bir ayarlayıcı yöntemine @Autowired koyuyordu. Aynı nesne için başkaları için bazı bağımlılıklar ve yapıcı enjeksiyonu için alan enjeksiyonu kullanabilirsiniz.

+2

Sadece (Bahar 3.0 ile) yapılan saha "nihai" de ikinci seçeneğinde, yani bunun nihai alanda @Autowired koymak için iyi iş gibi görünüyor ve kablolama aslında çalışacaktır olarak işaretlenebilir bir deneye göre işlem esnasında! Sanırım işe yarıyor çünkü Spring, alanı "son" değiştiriciyi yansıtma yoluyla atladığında atlar. Herkes bunu biraz daha aydınlatabilir mi? –

+0

@Mikko İşe şaşırdım. "Son" değiştirici eşzamanlılık için bazı garantiler sağlar. Bahar inşaattan sonra nihai alanları değiştiriyorsa, bu faydalardan bir kısmını kaybedersiniz. – NamshubWriter

0

açıklama, mülkle gider; otomatik olarak ayarlanacak özellik. This tutorial'un güzel bir örneği var. This more advanced example, kablo tesisatını ayırmak için niteleyicilerin nasıl kullanılacağını gösterir.