即使有助於完全消除spring註解中的和元素,但是還是不能完全消除,仍然需要使用元素顯示定義bean。因此元素出現了,它除了完成一樣的工作,還允許spring自動檢測bean和定義bean。這就意味著我們不使用元素,spring應用中的大多數(或者所有)bean都能夠實現定義和裝配。
為了配置spring自動檢測,需要使用元素來代替元素:
xmlns:xsi=""xmlns:context=""xsi:schemalocation=" /spring-beans.xsd /spring-context.xsd">
元素會掃瞄指定的包以及所有子包,並查詢出能夠自動註冊為spring bean的類。base-package屬性標示了元素所掃瞄的包。
為自動檢測標註bean
預設情況下,查詢使用構造型(stereotype)註解所標註的類,這些特殊的註解如下:
型別說明
@component
通用的構造型註解,標示該類為spring 元件。
@controller
標識將該類定義為spring mvc controller。
@repository
標識將該類定義為資料倉儲(例如:dao層)。
@service
標識將該類定義為服務(例如:service層)。
1. @component
假設我們應用上下文中僅僅包含student和school兩個bean。我們可以配置元素並使用@component註解標註student和school類,從而消除顯示的定義。
package com.sjf.bean;
import org.springframework.stereotype.component;/*** 學校實體類* @author sjf0115**/@componentpublic class school
spring掃瞄com.sjf.bean包時,會發現使用component註解所標註的school,並自動將它註冊為spring bean。bean的id預設為無限定類名(第乙個字母小寫),school bean的id為school。
下面我們標註student類:
package com.sjf.bean;
import org.springframework.stereotype.component;/*** 學生實體類* @author sjf0115**/@component("studentbean")public class student
這種場景下,我們指定了乙個bean id作為@component註解的引數。該bean 的id不會使用預設的類名,而是顯示的命名為studentbean。
當使用時,基於註解的自動檢測只是一種掃瞄策略。下面讓我們來了解其他的掃瞄策略來查詢候選bean。
2. 過濾元件掃瞄
在如何掃瞄來獲得候選bean方面,元素非常靈活。通過為配置和子元素,我們可以隨意調整掃瞄行為。
假設我們基於註解讓自動註冊所有實現某個介面的類,我們不得不瀏覽每乙個介面實現的類,並使用@component來標註它們,非常不方便。所以我們替換掉基於註解的元件掃瞄策略,再增加乙個包含過濾器來要求註冊以及排除類。
的type和expression屬性一起協作來定義元件掃瞄策略。我們還可以選擇如下任意一種過濾器:
型別說明
annotation
過濾器掃瞄使用指定註解標註的那些類,通過expression屬性指定要掃瞄的註解
assignable
過濾器掃瞄派生於expression屬性所指定型別的那些類。
aspectj
過濾器掃瞄與expression屬性所指定的aspectj表示式所匹配的那些類。
custom
使用自定義的org.springframework.core.type.typefilter實現類,該類由expression屬性指定。
regex
過濾器掃瞄類的名稱與expression屬性所指定的正規表示式所匹配的那些類。
除了使用告知哪些類需要註冊為spring bean以外,我們還可以使用來告知哪些類不需要註冊為spring bean。
我們實現了兩個介面,乙個是worker介面(員工),乙個是performer(表演者)。然後根據這兩個介面,分別實現了介面的實現類:
package com.sjf.bean;
/*** 農民實體類* @author sjf0115**/public class farmer implements worker }
我們使用告知實現了worker介面的實現類需要註冊為spring bean,使用來告知實現了perfomer介面的實現類不需要註冊為spring bean。
我們測試一下上述過濾器是否起作用了:
farmer farmer = (farmer) context.getbean("farmer");
farmer.work();
執行結果:
正在辛勤的耕地...
singer singer = (singer) context.getbean("singer");
singer.perform();
執行結果:
exceptioninthread"main"org.springframework.beans.factory.nosuchbeandefinitionexception:nobeannamed'singer'isdefined
參考:《spring實戰》
spring實戰五之Bean的自動檢測
在spring實戰四中,使用在spring中增加的方式告訴spring,我們打算使用基於註解的自動裝配,希望spring特殊對待我們所定義的bean裡的某一組註解,並使用這些註解指導bean的裝配。即使 有助於完全消除spring配置中的 和元素,我們仍然需要使用元素顯示定義bean。而在另一方面,...
spring 自動檢測bean
當在spring配置中增加時,我們希望spring特殊對待我們所定義的bean裡的某一組註解,並使用這些註解指導bean裝配。即使有助於完全消除spring配置中的和元素,我們仍需要使用元素顯示定義bean。但是spring還有另一種技巧。元素除了完成與一樣的工作,還允許spring自動檢測bean...
Spring的bean自動裝配
基於xml自動裝配 使用設值注入方式裝配person例項 person1 class com.mengma.assembly.person name name value zhangsan name age value 20 bean 使用構造方法裝配person例項 person2 class c...