簡體   English   中英

何時在Spring中使用自動裝配

[英]When to use autowiring in Spring

我正在閱讀Pro Spring 3一書。 它有一段讓我很困惑的段落。 這一段是關於春天的自動裝配。 這是一段摘錄:

在大多數情況下,關於是否應該使用自動裝配問題的答案絕對是“不!”自動裝配可以節省您在小型應用程序中的時間,但在許多情況下,它會導致不良做法,並且在大型應用程序中不靈活。 使用byName似乎是一個好主意,但它可能會導致您為類提供人工屬性名稱,以便您可以利用自動裝配功能。 Spring背后的整個想法是,你可以創建你喜歡的類,讓Spring為你工作,而不是相反...

...對於任何重要的應用,不惜一切代價避免自動裝配。

我一直在我創建的應用程序中使用@Autowired標記。 有人可以解釋它有什么問題以及我應該使用什么?

關於我如何處理大多數事情的一個小例子是:

@Service("snippetService")
public class SnippetService {

    @Autowired
    private TestService testService;

    public Snippet getSnippet() {
        return testService.getSnippet();
    }
}    

使用像這樣“錯誤”的自動裝配還是我錯過了什么?

我相信這里有兩件事情混亂。 本章中“自動裝配”的含義是標記用於自動檢測和注入依賴關系的bean。 這可以通過設置“autowire”bean屬性來實現。

這實際上與使用@Autowired相反,其中您明確指出依賴注入的字段或setter。

看看這里: http//static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/beans.html#beans-factory-autowire

為了解釋它,假設你有

public class SnippetService {

    private TestService testService;

    public Snippet getSnippet() {
        return testService.getSnippet();
    }

    public void setTestService(TestService testService) {
      this.testService = testService;
    }
}

如果你定義了一個bean:

<bean class="mypackage.SnippetService" autowire="byType"/>

在這種情況下,spring會嘗試通過調用setTestService setter來注入匹配類型的bean, TestService 即使您沒有使用@Autowired 這確實是危險的,因為一些人可能不會被春天召喚。

如果設置autowire =“no”,除非使用@ @Autowired@Resource ,@ @Inject標記,否則不會注入任何內容。

你擁有的東西沒有任何問題,特別是如果你開始使用TestService一個實現。 正如Johan所提到的,最好使用@javax.annotation.Resource ,如果需要,它還允許您更具體(例如使用nametype屬性)。

我在這里看到的唯一問題是你失控了一點。 例如,假設您的應用配置中有兩個或更多TestService實例,並且您想要使用其中一個。 使用Autowire制作比使用配置XML為您注入更棘手。 這是你的書試圖指出的內容,即在大型應用程序中,這種需求更頻繁,變得困難/棘手。

如果你沒有這種情況,我認為很好。

如果您進行基於構造函數的自動裝配,則通過XML自動裝配是完全安全且有用的,特別是如果您使協作者成為私人決賽。

我很震驚,作者說,幾年前我在一個非常大的彈簧2.5項目上完成了上述工作。 (當時注釋支持在JBoss中不起作用)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM