[英]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
,如果需要,它還允許您更具體(例如使用name
或type
屬性)。
我在這里看到的唯一問題是你失控了一點。 例如,假設您的應用配置中有兩個或更多TestService
實例,並且您想要使用其中一個。 使用Autowire
制作比使用配置XML為您注入更棘手。 這是你的書試圖指出的內容,即在大型應用程序中,這種需求更頻繁,變得困難/棘手。
如果你沒有這種情況,我認為很好。
如果您進行基於構造函數的自動裝配,則通過XML自動裝配是完全安全且有用的,特別是如果您使協作者成為私人決賽。
我很震驚,作者說,幾年前我在一個非常大的彈簧2.5項目上完成了上述工作。 (當時注釋支持在JBoss中不起作用)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.