2013-04-26 148 views
2

我配線類與Spring註釋的幫助下接線春構造:通過註釋

public class MyClass { 

    @Autowired 
    private B b ; 

    @Value("${foo}") 
    private String c ; 

    @Value("${bar}") 
    private Integer i ; 

    public MyClass (B b, String c, Integer i) { 
      this.b = b ; 
      this.c = c ; 
      this.i = i ; 
    } 
} 

我想從場中刪除註釋,並將其移動到構造函數:

public class MyClass { 

    private B b ; 

    private String c ; 

    private Integer i ; 

    @Autowired 
    public MyClass (B b, @Value("${foo}") String c, @Value("${bar}") Integer i) { 
      this.b = b ; 
      this.c = c ; 
      this.i = i ; 
    } 
} 

以上是做這件事的好方法嗎?它使課堂變得更加美麗。有沒有其他的方式來使用註釋?

此外,這是否意味着b是Autowired,並且c和i通過@Value連線?也就是說,這裏@Value註解的使用是否覆蓋了c和i的@Autowired註解?

P.S. :我將註釋放在構造函數中,因爲我不想編寫setters,只能測試這個類。所以我必須寫一個帶參數的構造函數,並給我一個包含所有字段的對象。 Spring的問題在於,如果我在字段上添加參數並編寫一個帶參數的構造函數,那麼我也必須編寫一個無參數構造函數,我不想這麼做,因爲這意味着在對這個類的測試,我可以調用no參數構造函數來創建一個對象,然後調用setter來設置字段。

回答

0

在這種情況下,我根本不使用自動裝配,而是從bean定義中將參數注入構造函數。

public class MyClass { 
    private final B b ; 
    private final String c ; 
    private final Integer i ; 

    public MyClass (B b, String c, Integer i) { 
      this.b = b ; 
      this.c = c ; 
      this.i = i ; 
    } 
} 
+0

您必須通過xml或註釋來完成。我想通過註釋來完成。 – 2013-04-26 08:44:07

0

第一個例子,你不需要在構造函數中的參數(如果它在所有的作品)。這基本上是個人喜好的問題,但它確實有一定的影響:

  • 第二種方法比較容易在測試中使用(如果你沒有在第一個例子構造函數的參數,而不訴諸以「反思黑客」)
  • 第二種方法確保當它不使用Spring

然而,有些情況下春天需要你的bean有一個默認的構造函數某些情況下,所有的成員被正確初始化它也使用前沒有任何參數可以實例化你的bean,在這種情況下,你必須要我們第一種方法。通常,在使用AspectJ/AOP/Proxy時,會發生這種情況。我現在想不出一個具體的例子,但我遇到過幾次。

就我個人而言,我總是儘可能使用第二種方法。