版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
第Spring擴展BeanFactoryPostProcessor使用技巧詳解目錄1、Spring擴展點BeanFactoryPostProcessor使用技巧1.1、BeanDefinitionRegistryPostProcessor1.1.1、ScannedGenericBeanDefinition1.1.2、AnnotatedGenericBeanDefinition1.1.3、RootBeanDefinition1.2、環(huán)境變量Environment
1、Spring擴展點BeanFactoryPostProcessor使用技巧
方法
voidpostProcessBeanFactory(ConfigurableListableBeanFactorybeanFactory)
throwsBeansException;
其中提供一個ConfigurableListableBeanFactory回調(diào)對象,里面提供了很多框架內(nèi)部使用的方法,建議的話使用它的實現(xiàn)類去注冊Bean的信息。
不建議使用里面的方法直接實例化對象,因為過早的創(chuàng)建對象會導致后續(xù)Spring一些對Bean修飾執(zhí)行不到,生命周期不完整。
1.1、BeanDefinitionRegistryPostProcessor
BeanFactoryPostProcessor的實現(xiàn)類。
調(diào)用位置
org.springframework.context.support.PostProcessorRegistrationDelegate#invokeBeanFactoryPostProcessors(org.springframework.beans.factory.config.ConfigurableListableBeanFactory,
java.util.Listorg.springframework.beans.factory.config.BeanFactoryPostProcessor)
方法
voidpostProcessBeanDefinitionRegistry(BeanDefinitionRegistryregistry)
throwsBeansException;
一般來使用當前方法來注冊BeanDefinition。
voidregisterBeanDefinition(StringbeanName,BeanDefinitionbeanDefinition)throwsBeanDefinitionStoreException;
第一個參數(shù)填的是Bean的名稱,第二個就是Bean的信息。一般可以使用以下方式去獲取BeanDefinition。
1.1.1、ScannedGenericBeanDefinition
publicclassTest{
privatestaticfinalPathMatchingResourcePatternResolverPATTERN_RESOLVER=newPathMatchingResourcePatternResolver();
privatestaticfinalCachingMetadataReaderFactoryREADER_FACTORY=newCachingMetadataReaderFactory();
staticfinalStringDEFAULT_RESOURCE_PATTERN="**/*.class";
publicstaticvoidmain(String[]args)throwsIOException{
System.out.println(doScan("com.rookie.mybatis.study"));
privatestaticListScannedGenericBeanDefinitiondoScan(StringbasePackage)throwsIOException{
basePackage=ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX+
resolveBasePackage(basePackage)+'/'+DEFAULT_RESOURCE_PATTERN;
ListScannedGenericBeanDefinitionresult=newArrayList();
//當前會掃描該類下所有的類文件
Resource[]resources=PATTERN_RESOLVER.getResources(basePackage);
for(Resourceresource:resources){
MetadataReadermetadataReader=READER_FACTORY.getMetadataReader(resource);
ScannedGenericBeanDefinitionsbd=newScannedGenericBeanDefinition(metadataReader);
sbd.setSource(resource);
result.add(sbd);
returnresult;
privatestaticStringresolveBasePackage(StringbasePackage){
returnClassUtils.convertClassNameToResourcePath(newStandardEnvironment().resolveRequiredPlaceholders(basePackage));
以上方式會將包下的所有類都掃描到然后添加到Spring容器當中,以上代碼參考于Mybatis注冊Bean的方式。
1.1.2、AnnotatedGenericBeanDefinition
這種方式就很直接了。直接new一個對象將需要的Bean的class放進去。
AnnotatedGenericBeanDefinitionabd=newAnnotatedGenericBeanDefinition(Test.class);
1.1.3、RootBeanDefinition
這個實現(xiàn)類和上面很類似,只不過多了幾個構造方法:
RootBeanDefinitionrootBeanDefinition=newRootBeanDefinition(Test.class);
publicRootBeanDefinition(StringbeanClassName);
最主要的還是以下的構造器:
publicRootBeanDefinition(@NullableClassbeanClass,@NullableConstructorArgumentValuescargs,@NullableMutablePropertyValuespvs);
這個的話多了幾個參數(shù),ConstructorArgumentValues,看名字就大概可以猜的出是傳構造參數(shù)的。當我們需要創(chuàng)建的Bean是有參構造器時,我們就可以使用當前方法將構造參數(shù)傳遞進去。
ConstructorArgumentValuesconstructorArgumentValues=newConstructorArgumentValues();
//添加構造參數(shù)
constructorArgumentValues.addGenericArgumentValue(111);
這個添加的順序就代表了構造器參數(shù)的順序。
第二個對象我們可以通過它去修改類屬性的值。
//修改類屬性的值
MutablePropertyValuesmutablePropertyValues=newMutablePropertyValues();
mutablePropertyValues.addPropertyValue("age",555);
當然我們也可以通過其他工具類去創(chuàng)建:
BeanDefinitionBuilderbeanDefinitionBuilder=BeanDefinitionBuilder.rootBeanDefinition(TestBean.class);
beanDefinitionBuilder.addConstructorArgValue(1);registry.registerBeanDefinition("testBean",beanDefinitionBuilder.getBeanDefinition());
1.2、環(huán)境變量Environment
一般我們創(chuàng)建Bean的時候都喜歡去讀yml的配置文件,但是在當前對象中,直接使用注入的方式是獲取不到配置文件的:
@Value("${test.case}")
privateStringname;
@Autowired
privateEnvironmentenvironment;
這時候我們可以配合另外一個擴展點去獲取環(huán)境變量。因為在當前擴展點執(zhí)行的之后,Environment是已經(jīng)創(chuàng)建了放置進了IOC容器當中,我們需要通過下面的方式去獲?。?/p>
@Component
publicclassTestimplementsBeanDefinitionRegistryPostProcessor,ApplicationContextAware{
@Override
publicvoidpostProcessBeanDefinitionRegistry(BeanDefinitionRegistryregistry)throwsBeansException{
@Override
publicvoidpostProcessBeanFactory(ConfigurableListableBeanFactorybeanFactory)throwsBeansException{
@Override
publicvoidsetApplicationContext(ApplicationContextapplicationContext)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 電影活動拍攝方案策劃(3篇)
- 承德騎行活動策劃方案(3篇)
- 2025至2030中國共享經(jīng)濟模式創(chuàng)新與監(jiān)管框架完善研究報告
- 中國抗體藥物偶聯(lián)物臨床價值評估與定價策略研究
- 中國建筑設備智能化升級需求與技術路線圖研究
- 中國建筑機械細分市場潛力與投資風險評估報告
- 中國建筑工程機械跨境電商模式與海外倉布局策略報告
- 中國建筑工程機械行業(yè)融資模式與資本運作調(diào)研
- 中國建筑工程機械行業(yè)用戶培訓體系構建與實施
- 中國建筑工程機械行業(yè)技術創(chuàng)新與轉型升級研究報告
- 四川省攀枝花市2025-2026學年八年級上學期期末數(shù)學檢測(含答案)
- 2026年吉林大學附屬中學公開招聘教師備考題庫(4人)及參考答案詳解
- 2026中國電信四川公用信息產(chǎn)業(yè)有限責任公司社會成熟人才招聘備考題庫參考答案詳解
- 2025年大學旅游管理(旅游服務質(zhì)量管理)試題及答案
- 打捆機培訓課件
- 穿越機組裝教學課件
- GB/T 26332.3-2015光學和光子學光學薄膜第3部分:環(huán)境適應性
- GB/T 17626.4-2008電磁兼容試驗和測量技術電快速瞬變脈沖群抗擾度試驗
- GB/T 15153.1-1998遠動設備及系統(tǒng)第2部分:工作條件第1篇電源和電磁兼容性
- GB 22021-2008國家大地測量基本技術規(guī)定
- GA/T 1193-2014人身損害誤工期、護理期、營養(yǎng)期評定規(guī)范
評論
0/150
提交評論