Spring中的 import註解使用詳解

2021-10-03 16:03:20 字數 3995 閱讀 5132

@import註解對應著spring xml檔案中的,@import註解可以註冊元件,也可以將另一配置類中的bean載入到當前配置類。

@import註解支援匯入的類有以下三種:

假設有以下兩個配置類,將springconfig2載入到springconfig中,同時springconfig配置類還載入普通類yellow,**配置如下:

@configuration

@import()

public

class

springconfig

}@configuration

public

class

springconfig2

}

建立測試類,載入springconfig配置類,檢視ioc容器中建立所有的bean例項:

public

class

ioctest

}}

可以看到 springconfig2 定義的bean和普通的元件類yellow也成功配置到容器中。其中不帶任何註解的yellow類對應的預設bean的id為其全類名。結果如下:

當有多個配置類時,使用這種方法簡化了容器的例項化,因為只需要處理乙個類,而不需要開發人員在構建過程中記住大量的@configuration 類。

建立乙個類實現importselector介面,如下:

//自定義邏輯返回需要匯入的元件

public

class

myimportselector

implements

importselector;}

}

在配置類中的@import註解新增這個類,就完成了bean的配置

@configuration

@import()

public

class

springconfig

}

這樣在載入springconfig配置類時就會將com.learn.bean.red和com.learn.bean.blue類註冊為bean,雖然這個也能夠直接在@import註解中直接匯入相關的類,但是importselector實現類可以實現根據自定義的邏輯來定義bean。

例如,要實現當配置類上的@componentscan沒有指定要掃瞄的package或沒有使用@componentscan註解的時候,就預設把當前配置類所在的包當作@componentscan註解的basepackages屬性,對這個包的類進行掃瞄。

在importselector實現類就可以這樣定義,如下:

//自定義邏輯返回需要匯入的元件

public

class

myimportselector

implements

importselector

if(basepackages==null||basepackages.length==0)

catch

(classnotfoundexception e)

basepackages=

newstring

;}// true:預設typefilter生效,當需要自定義特定的類時使用false,關閉typefilter。

//這種模式會查詢出spring自帶的註解

classpathscanningcandidatecomponentprovider scanner=

newclasspathscanningcandidatecomponentprovider

(true);

//自定義掃瞄規則,這裡需要排除掉@configuration註解,

//因為@configuration註解在容器建立時就先裝配到容器中了

scanner.

addexcludefilter

(new

annotationtypefilter

(configuration.

class))

;//掃瞄實現指定介面的類,介面不會被掃瞄

assignabletypefilter(targettype));

setclasses =

newhashset

<

>()

;for

(string basepackage : basepackages)

}//返回掃瞄到的類

return classes.

toarray

(new

string

[classes.

size()

]);}

}

通過classpathscanningcandidatecomponentprovider(true)的構造器,就可以掃瞄出任何出任何我們新增了@component註解的類,那麼它是怎麼做到的呢? 我們來看一下這個構造方法傳入的是true,那麼就會呼叫到這個方法:

public

classpathscanningcandidatecomponentprovider

(boolean usedefaultfilters, environment environment)

setenvironment

(environment)

;setresourceloader

(null);}

@suppresswarnings

("unchecked"

)protected

void

registerdefaultfilters()

if(basepackages==null||basepackages.length==0)

catch

(classnotfoundexception e)

basepackages=

newstring

;}// 預設typefilter生效,這種模式會查詢出spring自帶的註解

classpathbeandefinitionscanner scanner=

newclasspathbeandefinitionscanner

(registry)

;//當需要自定義特定的類時使用這個構造器建立,引數選擇false,關閉預設的typefilter。

//classpathbeandefinitionscanner scanner2 = new classpathbeandefinitionscanner(registry, false);

//掃瞄實現指定介面的類,介面不會被掃瞄

assignabletypefilter(targettype));

scanner.

scan

(basepackages)

;// 實現當容器中存在bean才註冊另乙個bean

boolean b=registry.

containsbeandefinition

("person");

if(b)

}}

因為registerbeandefinitions方法不需要返回值,在實現類中可以使用classpathbeandefinitionscanner類進行掃瞄並自動註冊,它是classpathscanningcandidatecomponentprovider的子類,提供了scanner.scan(basepackages)方法掃瞄指定的basepackage下滿足條件的class並註冊它們為bean。

參考:spring(32)——importselector介紹

spring(33)——importbeandefinitionregistrar介紹

Spring中Responsebody註解的作用

好長一段時間以來都只是寫些測試 好久沒寫專案 了,以至於spring那套東西日漸生疏了。最近在折騰乙個小專案,寫了乙個controller用來響應ajax請求,結果斷點除錯發現一直返回 404 not response.折騰了快2小時,一直沒想到是註解的問題,萬般無賴之下上了度娘,方才如夢初醒,特意...

Spring配置檔案中的import

在實際的專案開發中,我們往往會分為很多不同的包,如果遇見為不同的包都設定spring配置檔案的情況,都寫在乙個總的配置檔案中,難免會造成配置檔案內容臃腫,不易閱讀的情況。在spring中,可以把配置檔案分散到各個模組中,然後在總的配置檔案中通過import元素引入這些配置檔案 1.預設情況下,使用相...

Spring3 0中 Import註解的功能

import註解的功能 使用 import增強aop功能詳見 spring3.0中基於註解形式的aop 多配置類的引入詳見 spring3.0中多配置類引入設定 匯入bean 是普通類,demoaspect.class是增強類 configuration import enableaspectjau...