配色: 字号:
Spring源码解析-applicationContext
2017-01-20 | 阅:  转:  |  分享 
  
Spring源码解析-applicationContext

Demo

uml类图

ApplicationContext

ApplicationListener

源码解析

主流程

obtainFreshBeanFactory

prepareBeanFactory

invokeBeanFactoryPostProcessors

registerBeanPostProcessors

registerListeners

finishRefresh

总结

在已经有BeanFactory可以完成Ioc功能情况下,spring又提供了ApplicationContext,why?可以简单理解BeanFactory为可用,ApplicationContext封装了Beanfactory,提供了上下文、国际化、监听等更多的可选功能,让其能用,使用时,优先使用ApplicationContext。



Demo



跟beanfactory的demo唯一不同的就是:



//BeanFactoryctx=newXmlBeanFactory(newClassPathResource("spring.xml"));



ApplicationContextctx=newClassPathXmlApplicationContext("spring.xml");

uml类图



ApplicationContext



applicationContext



ApplicationListener



ApplicationListener



源码解析



主流程



//ClassPathXmlApplicationContext

publicClassPathXmlApplicationContext(String[]configLocations,booleanrefresh)throwsBeansException{

this(configLocations,refresh,null);

}



publicClassPathXmlApplicationContext(String[]configLocations,booleanrefresh,ApplicationContextparent)

throwsBeansException{



super(parent);

//设置configLocations

setConfigLocations(configLocations);

if(refresh){

refresh();

}

}



//AbstractApplicationContext

publicvoidrefresh()throwsBeansException,IllegalStateException{

synchronized(this.startupShutdownMonitor){

//设置和校验系统变量和环境变量的值

prepareRefresh();



//获取beanFactory

ConfigurableListableBeanFactorybeanFactory=obtainFreshBeanFactory();



//配置BeanFactory上下文

prepareBeanFactory(beanFactory);



try{

//子类扩展,beanFactory的后置处理

postProcessBeanFactory(beanFactory);



//调用BeanFactory的后置处理器

invokeBeanFactoryPostProcessors(beanFactory);



//注册beanprocessors,只是注册,bean创建时调用.

registerBeanPostProcessors(beanFactory);



//国际化

initMessageSource();



//初始化监听的Multicaster,有自定义就是用自定义,没有就使用默认SimpleApplicationEventMulticaster

initApplicationEventMulticaster();



//子类扩展

onRefresh();



//注册listen

registerListeners();



//实例化所有非延迟加载的bean,相当于循环调用getbean

finishBeanFactoryInitialization(beanFactory);



//完成刷新,通知LifecycleProcessor,ContextRefreshedEvent事件(这个很有用,可以监听这个事件)

finishRefresh();

}



catch(BeansExceptionex){

//Destroyalreadycreatedsingletonstoavoiddanglingresources.

destroyBeans();



//Reset''active''flag.

cancelRefresh(ex);



//Propagateexceptiontocaller.

throwex;

}

}

整个refresh过程,流程清晰,从spring学了这一招。



obtainFreshBeanFactory



这个流程里面有个需要注意的地方:



//AbstractRefreshableApplicationContext

protectedvoidcustomizeBeanFactory(DefaultListableBeanFactorybeanFactory){

if(this.allowBeanDefinitionOverriding!=null){

beanFactory.setAllowBeanDefinitionOverriding(this.allowBeanDefinitionOverriding);

}

if(this.allowCircularReferences!=null){

beanFactory.setAllowCircularReferences(this.allowCircularReferences);

}

//用于@Autowire和@Qualifier,没试过,TODO

beanFactory.setAutowireCandidateResolver(newQualifierAnnotationAutowireCandidateResolver());

prepareBeanFactory



//ClassPathXmlApplicationContext

protectedvoidprepareBeanFactory(ConfigurableListableBeanFactorybeanFactory){

//Telltheinternalbeanfactorytousethecontext''sclassloaderetc.

beanFactory.setBeanClassLoader(getClassLoader());//之前beanfactory没有设置classLoader

beanFactory.setBeanExpressionResolver(newStandardBeanExpressionResolver());//el表达式

beanFactory.addPropertyEditorRegistrar(newResourceEditorRegistrar(this,this.getEnvironment()));//配置属性注入编辑器



//ApplicationContextAwareProcessor这个beanpostprocessor,在实例化前postProcessBeforeInitialization设置下面忽略的依赖

beanFactory.addBeanPostProcessor(newApplicationContextAwareProcessor(this));

beanFactory.ignoreDependencyInterface(ResourceLoaderAware.class);

beanFactory.ignoreDependencyInterface(ApplicationEventPublisherAware.class);

beanFactory.ignoreDependencyInterface(MessageSourceAware.class);

beanFactory.ignoreDependencyInterface(ApplicationContextAware.class);

beanFactory.ignoreDependencyInterface(EnvironmentAware.class);



//设置几个自动注册的依赖,注入的时候直接用

beanFactory.registerResolvableDependency(BeanFactory.class,beanFactory);

beanFactory.registerResolvableDependency(ResourceLoader.class,this);

beanFactory.registerResolvableDependency(ApplicationEventPublisher.class,this);

beanFactory.registerResolvableDependency(ApplicationContext.class,this);





//aop类加载期织入支持DetectaLoadTimeWeaverandprepareforweaving,iffound.

if(beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)){

beanFactory.addBeanPostProcessor(newLoadTimeWeaverAwareProcessor(beanFactory));

//SetatemporaryClassLoaderfortypematching.

beanFactory.setTempClassLoader(newContextTypeMatchClassLoader(beanFactory.getBeanClassLoader()));

}



////注册一些默认bean,方便使用

if(!beanFactory.containsBean(ENVIRONMENT_BEAN_NAME)){

beanFactory.registerSingleton(ENVIRONMENT_BEAN_NAME,getEnvironment());

}



if(!beanFactory.containsBean(SYSTEM_PROPERTIES_BEAN_NAME)){

beanFactory.registerSingleton(SYSTEM_PROPERTIES_BEAN_NAME,getEnvironment().getSystemProperties());

}



if(!beanFactory.containsBean(SYSTEM_ENVIRONMENT_BEAN_NAME)){

beanFactory.registerSingleton(SYSTEM_ENVIRONMENT_BEAN_NAME,getEnvironment().getSystemEnvironment());

}

invokeBeanFactoryPostProcessors



//AbstractApplicationContext

//BeanFactoryPostProcessor激活调用

protectedvoidinvokeBeanFactoryPostProcessors(ConfigurableListableBeanFactorybeanFactory){

//InvokeBeanDefinitionRegistryPostProcessorsfirst,ifany.

SetprocessedBeans=newHashSet();

//BeanDefinitionRegistry中的BeanPostProcessor

if(beanFactoryinstanceofBeanDefinitionRegistry){

BeanDefinitionRegistryregistry=(BeanDefinitionRegistry)beanFactory;

ListregularPostProcessors=newLinkedList();

ListregistryPostProcessors=

newLinkedList();

//硬编码进来的

for(BeanFactoryPostProcessorpostProcessor:getBeanFactoryPostProcessors()){

if(postProcessorinstanceofBeanDefinitionRegistryPostProcessor){

//BeanDefinitionRegistryPostProcessor继承了BeanFactoryPostProcessor,多了个调用postProcessBeanDefinitionRegistry,这里区分下

BeanDefinitionRegistryPostProcessorregistryPostProcessor=

(BeanDefinitionRegistryPostProcessor)postProcessor;

registryPostProcessor.postProcessBeanDefinitionRegistry(registry);

registryPostProcessors.add(registryPostProcessor);

}

else{

regularPostProcessors.add(postProcessor);

}

}

//配置的bean中获取

MapbeanMap=

beanFactory.getBeansOfType(BeanDefinitionRegistryPostProcessor.class,true,false);

ListregistryPostProcessorBeans=

newArrayList(beanMap.values());

OrderComparator.sort(registryPostProcessorBeans);

for(BeanDefinitionRegistryPostProcessorpostProcessor:registryPostProcessorBeans){

//调用postProcessBeawww.tt951.comnDefinitionRegistry

postProcessor.postProcessBeanDefinitionRegistry(registry);

}

//调用postProcessBeanFactory

invokeBeanFactoryPostProcessors(registryPostProcessors,beanFactory);

invokeBeanFactoryPostProcessors(registryPostProcessorBeans,beanFactory);

invokeBeanFactoryPostProcessors(regularPostProcessors,beanFactory);

//processedBeans包含所有处理过的

processedBeans.addAll(beanMap.keySet());

}

else{

//Invokefactoryprocessorsregisteredwiththecontextinstance.

invokeBeanFactoryPostProcessors(getBeanFactoryPostProcessors(),beanFactory);

}



//beanFactory中获取BeanFactoryPostProcessor

String[]postProcessorNames=

beanFactory.getBeanNamesForType(BeanFactoryPostProcessor.class,true,false);



//SeparatebetweenBeanFactoryPostProcessorsthatimplementPriorityOrdered,

//Ordered,andtherest.

ListpriorityOrderedPostProcessors=newArrayList();

ListorderedPostProcessorNames=newArrayList();

ListnonOrderedPostProcessorNames=newArrayList();

for(StringppName:postProcessorNames){

//按照PriorityOrdered\Ordered\其他区分下,如果已经处理过,会过滤掉,不会重复处理

if(processedBeans.contains(ppName)){

//skip-alreadyprocessedinfirstphaseabove

}

elseif(isTypeMatch(ppName,PriorityOrdered.class)){

priorityOrderedPostProcessors.add(beanFactory.getBean(ppName,BeanFactoryPostProcessor.class));

}

elseif(isTypeMatch(ppName,Ordered.class)){

orderedPostProcessorNames.add(ppName);

}

else{

nonOrderedPostProcessorNames.add(ppName);

}

}

//对分类过的排序然后调用

//First,invoketheBeanFactoryPostProcessorsthatimplementPriorityOrdered.

OrderComparator.sort(priorityOrderedPostProcessors);

invokeBeanFactoryPostProcessors(priorityOrderedPostProcessors,beanFactory);



//Next,invoketheBeanFactoryPostProcessorsthatimplementOrdered.

ListorderedPostProcessors=newArrayList();

for(StringpostProcessorName:orderedPostProcessorNames){

orderedPostProcessors.add(getBean(postProcessorName,BeanFactoryPostProcessor.class));

}

OrderComparator.sort(orderedPostProcessors);

invokeBeanFactoryPostProcessors(orderedPostProcessors,beanFactory);



//Finally,invokeallotherBeanFactoryPostProcessors.

ListnonOrderedPostProcessors=newArrayList();

for(StringpostProcessorName:nonOrderedPostProcessorNames){

nonOrderedPostProcessors.add(getBean(postProcessorName,BeanFactoryPostProcessor.class));

}

invokeBeanFactoryPostProcessors(nonOrderedPostProcessors,beanFactory);



registerBeanPostProcessors



//AbstractApplicationContext

//注册所有的BeanPostProcessor,只注册,不调用

protectedvoidregisterBeanPostProcessors(ConfigurableListableBeanFactorybeanFactory){

String[]postProcessorNames=beanFactory.getBeanNamesForType(BeanPostProcessor.class,true,false);



//注册BeanPostProcessorChecker,只是info日志表明bean没有被所有processor处理,没感觉想干嘛

intbeanProcessorTargetCount=beanFactory.getBeanPostProcessorCount()+1+postProcessorNames.length;

beanFactory.addBeanPostProcessor(newBeanPostProcessorChecker(beanFactory,beanProcessorTargetCount));



//按照实现PriorityOrdered,Ordered,其他.分类排序注册到beanfactory

ListpriorityOrderedPostProcessors=newArrayList();

ListinternalPostProcessors=newArrayList();

ListorderedPostProcessorNames=newArrayList();

ListnonOrderedPostProcessorNames=newArrayList();

for(StringppName:postProcessorNames){

if(isTypeMatch(ppName,PriorityOrdered.class)){

BeanPostProcessorpp=beanFactory.getBean(ppName,BeanPostProcessor.class);

priorityOrderedPostProcessors.add(pp);

if(ppinstanceofMergedBeanDefinitionPostProcessor){

internalPostProcessors.add(pp);

}

}

elseif(isTypeMatch(ppName,Ordered.class)){

orderedPostProcessorNames.add(ppName);

}

else{

nonOrderedPostProcessorNames.add(ppName);

}

}



//First,registertheBeanPostProcessorsthatimplementPriorityOrdered.

OrderComparator.sort(priorityOrderedPostProcessors);

registerBeanPostProcessors(beanFactory,priorityOrderedPostProcessors);



//Next,registertheBeanPostProcessorsthatimplementOrdered.

ListorderedPostProcessors=newArrayList();

for(StringppName:orderedPostProcessorNames){

BeanPostProcessorpp=beanFactory.getBean(ppName,BeanPostProcessor.class);

orderedPostProcessors.add(pp);

if(ppinstanceofMergedBeanDefinitionPostProcessor){

internalPostProcessors.add(pp);

}

}

OrderComparator.sort(orderedPostProcessors);

registerBeanPostProcessors(beanFactory,orderedPostProcessors);



//Now,registerallregularBeanPostProcessors.

ListnonOrderedPostProcessors=newArrayList();

for(StringppName:nonOrderedPostProcessorNames){

BeanPostProcessorpp=beanFactory.getBean(ppName,BeanPostProcessor.class);

nonOrderedPostProcessors.add(pp);

if(ppinstanceofMergedBeanDefinitionPostProcessor){

internalPostProcessors.add(pp);

}

}

registerBeanPostProcessors(beanFactory,nonOrderedPostProcessors);



//Finally,re-registerallinternalBeanPostProcessors.

OrderComparator.sort(internalPostProcessors);

registerBeanPostProcessors(beanFactory,internalPostProcessors);

//ApplicationListenerDetector初始化后,如果是listener,添加到监听里面

beanFactory.addBeanPostProcessor(newApplicationListenerDetector());

}



//注册所有的BeanPostProcessor到Beanfactory

privatevoidregisterBeanPostProcessors(

ConfigurableListableBeanFactorybeanFactory,ListpostProcessors){



for(BeanPostProcessorpostProcessor:postProcessors){

beanFactory.addBeanPostProcessor(postProcessor);

}



只注册,不调用,跟beanfactoryprocessor不一样。



registerListeners



//AbstractApplicationContext

protectedvoidregisterListeners(){

//注册硬编码的listener

for(ApplicationListenerlistener:getApplicationListeners()){

getApplicationEventMulticaster().addApplicationListener(listener);

}

//注册xml配置的listener

String[]listenerBeanNames=getBeanNamesForType(ApplicationListener.class,true,false);

for(StringlisName:listenerwww.baiyuewang.netBeanNames){

getApplicationEventMulticaster().addApplicationListenerBean(lisName);

}



finishRefresh



//AbstractApplicationContext

protectedvoidfinishRefresh(){

//初始化LifecycleProcessor,有自定义就使用自定义的,没有就使用DefaultLifecycleProcessor(onRefresh和onClose)

initLifecycleProcessor();



//广播onRefresh给所有实现lifeProcessor

getLifecycleProcessor().onRefresh();



//PublishContextRefreshedEvent事件

publishEvent(newContextRefreshedEvent(this));

}



可以通过监听ContextRefreshedEvent事件,在所有applicationContext完成所有操作后修改bean,做其他操作。

献花(0)
+1
(本文系thedust79首藏)