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