Spring實戰系列 (14)Bean的自動檢測

2022-09-23 08:33:09 字數 2682 閱讀 9035

即使有助於完全消除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...