Spring擴展BeanFactoryPostProcessor使用技巧詳解_第1頁
Spring擴展BeanFactoryPostProcessor使用技巧詳解_第2頁
Spring擴展BeanFactoryPostProcessor使用技巧詳解_第3頁
Spring擴展BeanFactoryPostProcessor使用技巧詳解_第4頁
Spring擴展BeanFactoryPostProcessor使用技巧詳解_第5頁
已閱讀5頁,還剩1頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論