本節書摘來自異步社群《spring攻略(第2版)》一書中的第1章,第1.5節,作者: 【美】gary mak , josh long , daniel rubio著,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視
1.5.1 問題
組成應用程式的bean往往需要互相協作完成應用功能。為了bean之間的互相通路,你必須在bean配置檔案中指定bean引用。
1.5.2 解決方案
在bean配置檔案中,你可以用元素為bean屬性或者構造程式參數指定bean引用。隻需要用元素指定一個簡單值就可以輕松完成這一工作。你也可以像内部bean一樣直接地在屬性或者構造程式中包含一個bean聲明。
1.5.3 工作原理
在你的序列生成器中接受字元串值作為字首的靈活性不足以滿足将來的要求。如果字首生成可以由某種程式設計邏輯自定義将會更好。你可以建立prefixgenerator接口來定義字首生成操作。
使用特殊的模式格式化目前系統日期是一種字首生成政策。讓我們建立實作prefixgenerator接口的dateprefixgenerator類。
這個生成器的模式将通過設值方法setpattern()注入,然後用于建立java.text.dateformat對象格式化日期。由于模式字元串在dateformat對象建立之後不再使用,是以沒有必要将它存入一個私有字段中。
現在你可以用任意模式字元串聲明類型為dateprefixgenerator的bean來格式化日期。
為設值方法指定bean引用
為了應用這個字首生成器方法,sequencegenerator類應該接受prefixgenerator類型的對象而不是簡單的字首字元串。你可以選擇設定方法注入來接受這個字首生成器。你必須删除可能導緻編譯錯誤的prefix屬性,以及設值方法和構造程式。
然後,sequencegenerator bean可以包含一個元素,引用dateprefixgenerator bean作為其prefixgenerator屬性。
元素的bean屬性中的bean名稱可以是對ioc容器中的任何bean的引用,即使這個bean不在同一個xml配置檔案中定義。如果你引用相同xml檔案中的一個bean,應該使用local屬性,因為這是一個xml id引用。你的xml編輯器将幫助你校驗bean id是否存在于相同的xml檔案中(也就是引用完整性)。
還有一個在元素的ref屬性中指定bean引用的友善簡寫。
但是這樣一來,你的xml編輯器将不能校驗引用完整性。實際上,這跟指定元素的bean屬性效果相同。
spring 2.x提供另一個便利的簡寫來指定bean引用,使用pschema将bean引用作為元素的一個屬性。這可以縮短xml配置行。
為了區分bean引用與簡單的屬性值,你必須在屬性名後面加上-ref字尾。
為構造程式參數指定bean引用
bean引用也可以應用到構造程式注入。例如,你可以添加一個接受prefixgenerator對象參數的構造程式。
在元素中,你可以用像在元素中一樣包含一個bean引用。
指定bean引用的簡寫也适用于。
聲明内部bean
如果bean執行個體隻用于一個特殊的屬性,可以聲明為内部bean。内部bean聲明直接包含在或中,不設定任何id或者name屬性。這樣,這個bean将是匿名的,無法在别處使用。實際上,即使為内部bean定義id或者name屬性,也将被忽略。
内部bean也可以在構造程式參數中聲明。