2010-09-19 300 views
28

哪一個更正確?@Autowired註釋應該放在哪裏 - 屬性或方法?

這(與方法@Autowired註釋)?

@Controller 
public class MyController 
{ 
    private MyDao myDao; 

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

這(與屬性@Autowired註釋)?

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

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

@Autowired註釋應該去哪裏?

回答

47

根據the Javadoc for Autowired,可以在「構造函數,字段,設置方法或配置方法」上使用註釋。有關更多詳細信息,請參見the full documentation

我個人比較喜歡你的第一個選項(構造函數注入),因爲myDao字段可以標記爲final:

@Controller 
public class MyControllear { 
    private final MyDao myDao; 

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

構造函數注入,您還可以測試在單元測試的類,而不依賴於代碼彈簧。

,第二種選擇將更好的寫法如下:

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

    MyController() { 
    } 

隨着場注入,Spring將創建對象,然後更新標記爲注射劑領域。你沒有提到

一種選擇是在setter方法把@Autowired(setter注入):

@Controller 
public class MyControllear { 
    private MyDao myDao; 

    MyController() { 
    } 

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

你不必選擇一個或另一個。對於同一對象,您可以將字段注入用於某些依賴項,並將構造函數注入用於其他人。

+2

根據我剛剛做的一個實驗(使用Spring 3.0),該字段在第二個選項中也可以標記爲「final」,即它似乎可以很好地將@Autowired放在最終字段上,並且佈線實際上可以工作在運行時!我猜想它是有效的,因爲當它通過反射設置字段時,Spring繞過了「最終」修飾符。任何人都可以確認/發現更多的光線? – 2013-02-22 14:55:19

+0

@Mikko我很驚訝的作品。 「最終」修飾符爲併發提供了一些保證。如果Spring在施工後正在修改最終場地,那麼您正在失去其中的一些好處。 – NamshubWriter 2013-02-26 16:59:22

0

該註釋與屬性一起使用,因爲這是自動裝配的;該屬性被自動設置。 This tutorial有個很好的例子。 This more advanced example顯示如何使用限定符來消除佈線歧義。