在spring實戰四中,使用在spring中增加的方式告訴spring,我們打算使用基於註解的自動裝配,希望spring特殊對待我們所定義的bean裡的某一組註解,並使用這些註解指導bean的裝配。即使 有助於完全消除spring配置中的 和元素,我們仍然需要使用元素顯示定義bean。
而在另一方面,spring提供了自動檢測功能, 元素除了完成與一樣的工作外,還允許spring自動檢測bean和定義bean。這意味著不使用元素,spring中的大多數或者所有bean都能夠實現定義和裝配。
為了配置spring自動檢測,需要使用元素來代替元素:
<beans
xmlns
=""xmlns:xsi
=""xmlns:context
=""xsi:schemalocation
="/spring-beans-3.0.xsd
/spring-context-3.0.xsd"
>
<
context:component-scan
base-package
="com.springinaction.springidol"
>
context:component-scan
>
beans
>
元素會掃瞄指定的包及其子包,並查詢出能夠自動註冊為spring bean的類。base-package屬性標識了元素所掃瞄的包。
如何知道哪些類需要註冊為spring bean呢?
1. 為自動檢測標註bean
預設情況下,查詢使用構造型(stereotype)註解所標註的類,這些特殊的註解如下:
* @component 通用的構造型註解,標識該類為spring元件
* @controller 標識將該類定義為spring mvc 控制器
* @repository 標識將該類定義為資料倉儲(在使用資料庫的時候可以用到該註解)
* @service 標識將該類定義為服務
* 使用@component標註的任意自定義註解
例如,我們的上下文中僅僅包含eddie和guitar兩個bean。可以配置元素並使用@component註解標註instrumentlist和guitar類,從而消除顯示的定義。
首先,使用@component註解標註guitar類:
packagecom.springinaction.springidol;
import
org.springframework.stereotype.component;
@component
public
class guitar implements
instrument
}
spring 掃瞄com.springinaction.springidol包時,會發現使用@component註解所標註的guitar,並自動將它註冊為spring bean。bean的id預設為無限定類名。在這種場景下,guitar的id為guitar。
現在再標註instrumentlist類:
packagecom.springinaction.springidol;
import
org.springframework.beans.factory.annotation.autowired;
import
org.springframework.stereotype.component;
@component("eddie")
public
class instrumentalist implements
performer
在這種場景下,指定了乙個bean id作為@component註解的引數。該bean的id不是預設類的名稱,而是顯示命名為eddie。
2. 過濾元件掃瞄
在如何掃瞄獲得候選bean方面非常靈活,通過為配置和/或者子元素,我們可以隨意調整掃瞄行為。
考慮乙個問題:如何基於註解讓自動註冊所有實現instrument介面的類?
我們替換掉基於註解的元件掃瞄策略,再增加乙個包含過濾器來要求自動註冊所有的instrument實現類,如下所示:
<context:component-scan
base-package
="com.springinaction.springidol"
>
<
context:include-filter
type
="assignable"
expression
="com.springinaction.springidol.instrument"
/>
context:component-scan
><
context:include-filter
的type和expression屬性一起協作來定義元件掃瞄策略。我們還可以選擇下面任意一種過濾器。
除了使用告知哪些類需要註冊為spring bean以外,還可以使用告知哪些類不需要註冊為spring bean。例如下面所示,除了使用自定義@skipit註解的類,其他所有的instrument實現都需要註冊為spring bean,如下所示:
<context:component-scan
base-package
="com.springinaction.springidol"
>
<
context:include-filter
type
="assignable"
expression
="com.springinaction.springidol.instrument"
/>
<
context:exclude-filter
type
="annotation"
expression
="com.springinaction.springidol.skipit"
/>
context:component-scan
>
當對應用過濾器時,可以有無限的過濾可能。但是我們會發現預設的基於註解的過濾策略是最經常用到的。
Spring實戰之Bean銷毀之前的行為操作示例
一 配置 程式設計客棧 二 介面 1 axe package org.crazyit.app.service public inte ce axe 2 person package org.crazyit.app.service public inte ce person 三 bean 1 chin...
Spring實戰 6 內部Bean
本篇文章講解了spring的通過內部bean設定bean的屬性。類似內部類,內部bean與普通的bean關聯不同的是 1 普通的bean,在其他的bean例項引用時,都引用同乙個例項。2 內部bean,每次引用時都是新建立的例項。鑑於上述的場景,內部bean是乙個很常用的程式設計模式。下面先通過前文...
spring實戰 條件裝配bean
在做大型專案時,我們的系統會有多個執行環境,如開發人員自己的本地環境dev,測試人員的測試環境sit,上線前的預生產環境pre,線上環境prd 在不同環境中我們可能需要不同的配置,如資料庫配置,mq配置等,在不同的環境都有相應的不同的配置,這時候我們需要根據不同的環境來建立不同的配置 強大的spri...