2011-09-09 63 views
5

我有一個關於組件掃描以及在Spring版本3.0.5.RELEASE中爲同一服務類別的XML配置中使用額外bean定義的問題。爲同一個類混合組件掃描和XML bean定義時的Spring行爲?

我創建了一個類 「爲MyService」 與

@Service("myService") 

註釋並有同一類的bean定義,看起來像這樣:

<bean id="myService" class="....MyService" /> 

我把

System.out.println("MyService has been instantiated"); 

消息到MyService類的構造函數中。當我的應用程序啓動時,該消息將僅在控制檯上顯示一次。 Spring似乎足夠聰明,可以檢測到,只有一個ID爲「myService」的類的實例。

但是,即使當我改變了註釋

@Service("myService2") 

並保留XML bean定義ID爲「爲myService」,類只會被實例化一次。

我的兩個問題是:

  1. 雖然這是我現在想要的行爲,是可能混淆XML bean定義和組件掃描一類,把它用實例化兩次不同的Bean ID?

  2. 有誰知道,春天機制是什麼「幕後」? Spring如何決定何時只實例化一次類? (也許它只是不允許爲同一類混用組件掃描和XML bean定義?)

非常感謝您的幫助!

回答

6

您的問題2.可以很容易地回答。 Spring根據它們的作用域來實例化bean。無論您使用xml還是基於註釋的配置,默認範圍都是「singleton」。如果您將bean聲明爲scope = prototype,那麼每當容器被請求bean時它都會被實例化。

作爲註解:

@Scope(StandardScopes.PROTOTYPE) 

在XML:

<bean .... scope="prototype"> 

如果你需要一個bean的正好有兩個情況下,最好將宣佈他們兩個在XML dfiferent名我會想。

關於你的問題1,我不知道是否可以聲明一個類的兩個實例,一個使用註解,一個使用XML。你確定類路徑掃描在你的例子中真正起作用嗎?拋開XML bean聲明並再試一次,你有沒有bean的實例呢?如果沒有,你應該首先修復類路徑掃描,因爲它似乎不工作。

無論如何,最重要的問題是:你爲什麼要這麼做?混合這兩種類型的配置會產生不可維護的代碼。不要混用配置類型,只能使用一種配置類型,或者告訴我們爲什麼你需要這種配置。

1

您可以使用組件掃描並同時在xml中定義bean。然而這也取決於bean的範圍。

閱讀post瞭解更多信息。

如果啓用了組件掃描,spring將嘗試創建一個bean,即使該類的bean已經在spring config xml中定義。但是,如果在spring配置文件和自動發現的bean中定義的bean具有相同的名稱,那麼Spring在進行組件掃描時不會創建新的bean。如果一個bean沒有一個無參數構造函數,那麼至少有一個構造函數必須是自動連線的。如果沒有構造函數是自動連線的,spring將嘗試使用默認的無參數構造函數創建一個對象。

相關問題