spring實戰五之Bean的自動檢測

2022-05-06 19:21:09 字數 3304 閱讀 1091

在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類:

package

com.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類:

package

com.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...