Spring启动流程refresh()源码深入解析
一、Spring容器的refresh()
spring version:4.3.12 ,尚硅谷Spring注解驱动开发—源码部分
//refresh():543,AbstractApplicationContext(org.springframework.context.support)
publicvoidrefresh()throwsBeansException,IllegalStateException{
synchronized(this.startupShutdownMonitor){
//1刷新前的预处理
prepareRefresh();
//2获取BeanFactory;刚创建的默认DefaultListableBeanFactory
ConfigurableListableBeanFactorybeanFactory=obtainFreshBeanFactory();
//3BeanFactory的预准备工作(BeanFactory进行一些设置)
prepareBeanFactory(beanFactory);
try{
//4BeanFactory准备工作完成后进行的后置处理工作;
//4.1)、抽象的方法,当前未做处理。子类通过重写这个方法来在BeanFactory创建并预准备完成以后做进一步的设置
postProcessBeanFactory(beanFactory);
/**************************以上是BeanFactory的创建及预准备工作****************/
//5执行BeanFactoryPostProcessor的方法;
//BeanFactoryPostProcessor:BeanFactory的后置处理器。在BeanFactory标准初始化之后执行的;
//他的重要两个接口:BeanFactoryPostProcessor、BeanDefinitionRegistryPostProcessor
invokeBeanFactoryPostProcessors(beanFactory);
//6注册BeanPostProcessor(Bean的后置处理器)
registerBeanPostProcessors(beanFactory);
//7initMessageSource();初始化MessageSource组件(做国际化功能;消息绑定,消息解析);
initMessageSource();
//8初始化事件派发器
initApplicationEventMulticaster();
//9子类重写这个方法,在容器刷新的时候可以自定义逻辑;
onRefresh();
//10给容器中将所有项目里面的ApplicationListener注册进来
registerListeners();
//11.初始化所有剩下的单实例bean;
finishBeanFactoryInitialization(beanFactory);
//12.完成BeanFactory的初始化创建工作;IOC容器就创建完成;
finishRefresh();
}
catch(BeansExceptionex){
if(logger.isWarnEnabled()){
logger.warn("Exceptionencounteredduringcontextinitialization-"+
"cancellingrefreshattempt:"+ex);
}
//Destroyalreadycreatedsingletonstoavoiddanglingresources.
destroyBeans();
//Reset'active'flag.
cancelRefresh(ex);
//Propagateexceptiontocaller.
throwex;
}
finally{
//ResetcommonintrospectioncachesinSpring'score,sincewe
//mightnoteverneedmetadataforsingletonbeansanymore...
resetCommonCaches();
}
}
}
1、prepareRefresh()刷新前的预处理;
//刷新前的预处理;
protectedvoidprepareRefresh(){
this.startupDate=System.currentTimeMillis();
this.closed.set(false);
this.active.set(true);
if(logger.isInfoEnabled()){
logger.info("Refreshing"+this);
}
//初始化一些属性设置;子类自定义个性化的属性设置方法;
initPropertySources();
//校验配置文件的属性,合法性
getEnvironment().validateRequiredProperties();
//保存容器中的一些事件
this.earlyApplicationEvents=newLinkedHashSet();
}
2、obtainFreshBeanFactory();创建了一个BeanFactory
protectedConfigurableListableBeanFactoryobtainFreshBeanFactory(){
refreshBeanFactory();//创建了一个this.beanFactory=newDefaultListableBeanFactory();设置了序列化的ID
//返回刚才创建的DefaultListableBeanFactory
ConfigurableListableBeanFactorybeanFactory=getBeanFactory();
if(logger.isDebugEnabled()){
logger.debug("Beanfactoryfor"+getDisplayName()+":"+beanFactory);
}
returnbeanFactory;
}
3、BeanFactory的预准备工作
protectedvoidprepareBeanFactory(ConfigurableListableBeanFactorybeanFactory){
//1)、设置BeanFactory的类加载器
beanFactory.setBeanClassLoader(getClassLoader());
//1)、设置支持表达式解析器
beanFactory.setBeanExpressionResolver(newStandardBeanExpressionResolver(beanFactory.getBeanClassLoader()));
beanFactory.addPropertyEditorRegistrar(newResourceEditorRegistrar(this,getEnvironment()));
//2)、添加部分BeanPostProcessor【ApplicationContextAwareProcessor】
beanFactory.addBeanPostProcessor(newApplicationContextAwareProcessor(this));
//3)、设置忽略的自动装配的接口EnvironmentAware、EmbeddedValueResolverAware、xxx;
//这些接口的实现类不能通过类型来自动注入
beanFactory.ignoreDependencyInterface(EnvironmentAware.class);
beanFactory.ignoreDependencyInterface(EmbeddedValueResolverAware.class);
beanFactory.ignoreDependencyInterface(ResourceLoaderAware.class);
beanFactory.ignoreDependencyInterface(ApplicationEventPublisherAware.class);
beanFactory.ignoreDependencyInterface(MessageSourceAware.class);
beanFactory.ignoreDependencyInterface(ApplicationContextAware.class);
//4)、注册可以解析的自动装配;我们能直接在任何组件中自动注入:
//BeanFactory、ResourceLoader、ApplicationEventPublisher、ApplicationContext
/*其他组件中可以通过下面方式直接注册使用
@autowired
BeanFactorybeanFactory*/
beanFactory.registerResolvableDependency(BeanFactory.class,beanFactory);
beanFactory.registerResolvableDependency(ResourceLoader.class,this);
beanFactory.registerResolvableDependency(ApplicationEventPublisher.class,this);
beanFactory.registerResolvableDependency(ApplicationContext.class,this);
//5)、添加BeanPostProcessor【ApplicationListenerDetector】后置处理器,在bean初始化前后的一些工作
beanFactory.addBeanPostProcessor(newApplicationListenerDetector(this));
//6)、添加编译时的AspectJ;
if(beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)){
beanFactory.addBeanPostProcessor(newLoadTimeWeaverAwareProcessor(beanFactory));
//SetatemporaryClassLoaderfortypematching.
beanFactory.setTempClassLoader(newContextTypeMatchClassLoader(beanFactory.getBeanClassLoader()));
}
//7)、给BeanFactory中注册一些能用的组件;
if(!beanFactory.containsLocalBean(ENVIRONMENT_BEAN_NAME)){
//环境信息ConfigurableEnvironment
beanFactory.registerSingleton(ENVIRONMENT_BEAN_NAME,getEnvironment());
}
//系统属性,systemProperties【Map】
if(!beanFactory.containsLocalBean(SYSTEM_PROPERTIES_BEAN_NAME)){
beanFactory.registerSingleton(SYSTEM_PROPERTIES_BEAN_NAME,getEnvironment().getSystemProperties());
}
//系统环境变量systemEnvironment【Map】
if(!beanFactory.containsLocalBean(SYSTEM_ENVIRONMENT_BEAN_NAME)){
beanFactory.registerSingleton(SYSTEM_ENVIRONMENT_BEAN_NAME,getEnvironment().getSystemEnvironment());
}
}
5执行BeanFactoryPostProcessor的后置处理器方法(BeanFactory);
protectedvoidinvokeBeanFactoryPostProcessors(ConfigurableListableBeanFactorybeanFactory){
//执行BeanFactoryPostProcessor的方法
PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory,getBeanFactoryPostProcessors());
//DetectaLoadTimeWeaverandprepareforweaving,iffoundinthemeantime
//(e.g.throughan@BeanmethodregisteredbyConfigurationClassPostProcessor)
if(beanFactory.getTempClassLoader()==null&&beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)){
beanFactory.addBeanPostProcessor(newLoadTimeWeaverAwareProcessor(beanFactory));
beanFactory.setTempClassLoader(newContextTypeMatchClassLoader(beanFactory.getBeanClassLoader()));
}
}
5.1 执行invokeBeanFactoryPostProcessors
publicstaticvoidinvokeBeanFactoryPostProcessors( ConfigurableListableBeanFactorybeanFactory,ListbeanFactoryPostProcessors){ //InvokeBeanDefinitionRegistryPostProcessorsfirst,ifany. Set processedBeans=newHashSet (); //判断beanFatory类型 if(beanFactoryinstanceofBeanDefinitionRegistry){ BeanDefinitionRegistryregistry=(BeanDefinitionRegistry)beanFactory; List regularPostProcessors=newLinkedList (); List registryProcessors=newLinkedList (); //得到所有的BeanFactoryPostProcessor遍历 for(BeanFactoryPostProcessorpostProcessor:beanFactoryPostProcessors){ if(postProcessorinstanceofBeanDefinitionRegistryPostProcessor){ BeanDefinitionRegistryPostProcessorregistryProcessor= (BeanDefinitionRegistryPostProcessor)postProcessor; registryProcessor.postProcessBeanDefinitionRegistry(registry); registryProcessors.add(registryProcessor); } else{ regularPostProcessors.add(postProcessor); } } //DonotinitializeFactoryBeanshere:Weneedtoleaveallregularbeans //uninitializedtoletthebeanfactorypost-processorsapplytothem! //SeparatebetweenBeanDefinitionRegistryPostProcessorsthatimplement //PriorityOrdered,Ordered,andtherest. List currentRegistryProcessors=newArrayList (); //从容器中获取所有的BeanDefinitionRegistryPostProcessor, String[]postProcessorNames= beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class,true,false); //第一步,先执行实现了PriorityOrdered接口的BeanDefinitionRegistryPostProcessor for(StringppName:postProcessorNames){ if(beanFactory.isTypeMatch(ppName,PriorityOrdered.class)){ currentRegistryProcessors.add(beanFactory.getBean(ppName,BeanDefinitionRegistryPostProcessor.class)); processedBeans.add(ppName); } } //排序 sortPostProcessors(currentRegistryProcessors,beanFactory); registryProcessors.addAll(currentRegistryProcessors); //执行BeanDefinitionRegistryPostProcessor的postProcessor.postProcessBeanDefinitionRegistry(registry) invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors,registry); currentRegistryProcessors.clear(); //在执行实现了Ordered顺序接口的BeanDefinitionRegistryPostProcessor; postProcessorNames=beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class,true,false); for(StringppName:postProcessorNames){ if(!processedBeans.contains(ppName)&&beanFactory.isTypeMatch(ppName,Ordered.class)){ currentRegistryProcessors.add(beanFactory.getBean(ppName,BeanDefinitionRegistryPostProcessor.class)); processedBeans.add(ppName); } } //排序 sortPostProcessors(currentRegistryProcessors,beanFactory); registryProcessors.addAll(currentRegistryProcessors); //执行postProcessor.postProcessBeanDefinitionRegistry(registry) invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors,registry); currentRegistryProcessors.clear(); //最后执行没有实现任何优先级或者是顺序接口的BeanDefinitionRegistryPostProcessors; booleanreiterate=true; while(reiterate){ reiterate=false; postProcessorNames=beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class,true,false); for(StringppName:postProcessorNames){ if(!processedBeans.contains(ppName)){ currentRegistryProcessors.add(beanFactory.getBean(ppName,BeanDefinitionRegistryPostProcessor.class)); processedBeans.add(ppName); reiterate=true; } } sortPostProcessors(currentRegistryProcessors,beanFactory); registryProcessors.addAll(currentRegistryProcessors); invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors,registry); currentRegistryProcessors.clear(); } //现在执行BeanFactoryPostProcessor的postProcessBeanFactory()方法 invokeBeanFactoryPostProcessors(registryProcessors,beanFactory); invokeBeanFactoryPostProcessors(regularPostProcessors,beanFactory); } else{ //Invokefactoryprocessorsregisteredwiththecontextinstance. invokeBeanFactoryPostProcessors(beanFactoryPostProcessors,beanFactory); } //再执行BeanFactoryPostProcessor的方法 //1)、获取所有的BeanFactoryPostProcessor和执行BeanDefinitionRegistryPostProcessors的接口逻辑一样 String[]postProcessorNames= beanFactory.getBeanNamesForType(BeanFactoryPostProcessor.class,true,false); List priorityOrderedPostProcessors=newArrayList (); List orderedPostProcessorNames=newArrayList (); List nonOrderedPostProcessorNames=newArrayList (); //把BeanFactoryPostProcessor分类 for(StringppName:postProcessorNames){ if(processedBeans.contains(ppName)){ //skip-alreadyprocessedinfirstphaseabove } elseif(beanFactory.isTypeMatch(ppName,PriorityOrdered.class)){ priorityOrderedPostProcessors.add(beanFactory.getBean(ppName,BeanFactoryPostProcessor.class)); } elseif(beanFactory.isTypeMatch(ppName,Ordered.class)){ orderedPostProcessorNames.add(ppName); } else{ nonOrderedPostProcessorNames.add(ppName); } } //2)、看先执行实现了PriorityOrdered优先级接口的BeanFactoryPostProcessor、 sortPostProcessors(priorityOrderedPostProcessors,beanFactory); invokeBeanFactoryPostProcessors(priorityOrderedPostProcessors,beanFactory); //3)、在执行实现了Ordered顺序接口的BeanFactoryPostProcessor; List orderedPostProcessors=newArrayList (); for(StringpostProcessorName:orderedPostProcessorNames){ orderedPostProcessors.add(beanFactory.getBean(postProcessorName,BeanFactoryPostProcessor.class)); } sortPostProcessors(orderedPostProcessors,beanFactory); invokeBeanFactoryPostProcessors(orderedPostProcessors,beanFactory); //4)、最后执行没有实现任何优先级或者是顺序接口的BeanFactoryPostProcessor; List nonOrderedPostProcessors=newArrayList (); for(StringpostProcessorName:nonOrderedPostProcessorNames){ nonOrderedPostProcessors.add(beanFactory.getBean(postProcessorName,BeanFactoryPostProcessor.class)); } invokeBeanFactoryPostProcessors(nonOrderedPostProcessors,beanFactory); beanFactory.clearMetadataCache(); }
6、注册BeanPostProcessor(Bean的后置处理器)
bean的创建拦截器
不同接口类型的BeanPostProcessor;在Bean创建前后的执行时机是不一样的
- BeanPostProcessor、
- DestructionAwareBeanPostProcessor、
- InstantiationAwareBeanPostProcessor、 在createBean()方法中处理的,bean创建之前调用的
- SmartInstantiationAwareBeanPostProcessor、
- MergedBeanDefinitionPostProcessor【internalPostProcessors】 (bean创建完成后调用,11章节中)
registerBeanPostProcessors(beanFactory);
publicstaticvoidregisterBeanPostProcessors(
ConfigurableListableBeanFactorybeanFactory,AbstractApplicationContextapplicationContext){
//1)、获取所有的BeanPostProcessor;后置处理器都默认可以通过PriorityOrdered、Ordered接口来执行优先级
String[]postProcessorNames=beanFactory.getBeanNamesForType(BeanPostProcessor.class,true,false);
//检查器,检查所有的BeanPostProcessor
intbeanProcessorTargetCount=beanFactory.getBeanPostProcessorCount()+1+postProcessorNames.length;
beanFactory.addBeanPostProcessor(newBeanPostProcessorChecker(beanFactory,beanProcessorTargetCount));
//SeparatebetweenBeanPostProcessorsthatimplementPriorityOrdered,
//Ordered,andtherest.
ListpriorityOrderedPostProcessors=newArrayList();
ListinternalPostProcessors=newArrayList();
ListorderedPostProcessorNames=newArrayList();
ListnonOrderedPostProcessorNames=newArrayList();
for(StringppName:postProcessorNames){
if(beanFactory.isTypeMatch(ppName,PriorityOrdered.class)){
BeanPostProcessorpp=beanFactory.getBean(ppName,BeanPostProcessor.class);
priorityOrderedPostProcessors.add(pp);
if(ppinstanceofMergedBeanDefinitionPostProcessor){
internalPostProcessors.add(pp);
}
}
elseif(beanFactory.isTypeMatch(ppName,Ordered.class)){
orderedPostProcessorNames.add(ppName);
}
else{
nonOrderedPostProcessorNames.add(ppName);
}
}
/*2)、先注册PriorityOrdered优先级接口的BeanPostProcessor;
把每一个BeanPostProcessor;添加到BeanFactory中
beanFactory.addBeanPostProcessor(postProcessor);*/
sortPostProcessors(priorityOrderedPostProcessors,beanFactory);
registerBeanPostProcessors(beanFactory,priorityOrderedPostProcessors);
//3)、再注册Ordered接口的
ListorderedPostProcessors=newArrayList();
for(StringppName:orderedPostProcessorNames){
BeanPostProcessorpp=beanFactory.getBean(ppName,BeanPostProcessor.class);
orderedPostProcessors.add(pp);
if(ppinstanceofMergedBeanDefinitionPostProcessor){
internalPostProcessors.add(pp);
}
}
sortPostProcessors(orderedPostProcessors,beanFactory);
registerBeanPostProcessors(beanFactory,orderedPostProcessors);
//4)、最后注册没有实现任何优先级接口的
ListnonOrderedPostProcessors=newArrayList();
for(StringppName:nonOrderedPostProcessorNames){
BeanPostProcessorpp=beanFactory.getBean(ppName,BeanPostProcessor.class);
nonOrderedPostProcessors.add(pp);
if(ppinstanceofMergedBeanDefinitionPostProcessor){
internalPostProcessors.add(pp);
}
}
registerBeanPostProcessors(beanFactory,nonOrderedPostProcessors);
//5)、最终注册MergedBeanDefinitionPostProcessor;
sortPostProcessors(internalPostProcessors,beanFactory);
registerBeanPostProcessors(beanFactory,internalPostProcessors);
//6)、注册一个ApplicationListenerDetector;判断创建完成的bean是否监听器
/*在Bean创建完成后ApplicationListenerDetector.postProcessAfterInitialization()中检查是否是ApplicationListener类型,如果是applicationContext.addApplicationListener((ApplicationListener>)bean);如果是添加到容器中*/
beanFactory.addBeanPostProcessor(newApplicationListenerDetector(applicationContext));
}
7、initMessageSource();国际化
初始化MessageSource组件(做国际化功能;消息绑定,消息解析);
protectedvoidinitMessageSource(){
//1)、获取BeanFactory
ConfigurableListableBeanFactorybeanFactory=getBeanFactory();
/*
2)、看容器中是否有id为messageSource的,类型是MessageSource的组件
如果有赋值给messageSource,如果没有自己创建一个DelegatingMessageSource;
MessageSource作用:取出国际化配置文件中的某个key的值;能按照区域信息获取;
*/
if(beanFactory.containsLocalBean(MESSAGE_SOURCE_BEAN_NAME)){
this.messageSource=beanFactory.getBean(MESSAGE_SOURCE_BEAN_NAME,MessageSource.class);
//MakeMessageSourceawareofparentMessageSource.
if(this.parent!=null&&this.messageSourceinstanceofHierarchicalMessageSource){
HierarchicalMessageSourcehms=(HierarchicalMessageSource)this.messageSource;
if(hms.getParentMessageSource()==null){
//OnlysetparentcontextasparentMessageSourceifnoparentMessageSource
//registeredalready.
hms.setParentMessageSource(getInternalParentMessageSource());
}
}
if(logger.isDebugEnabled()){
logger.debug("UsingMessageSource["+this.messageSource+"]");
}
}
else{
//如果没有自己创建一个DelegatingMessageSource;
DelegatingMessageSourcedms=newDelegatingMessageSource();
dms.setParentMessageSource(getInternalParentMessageSource());
this.messageSource=dms;
//把创建好的messageSource注册到容器中,以后获取国际化配置文件的值的时候,可以自动注入MessageSource;
//注入后通过这个方法使用MessageSource.getMessage(Stringcode,Object[]args,StringdefaultMessage,Localelocale);
beanFactory.registerSingleton(MESSAGE_SOURCE_BEAN_NAME,this.messageSource);
if(logger.isDebugEnabled()){
logger.debug("UnabletolocateMessageSourcewithname'"+MESSAGE_SOURCE_BEAN_NAME+
"':usingdefault["+this.messageSource+"]");
}
}
}
8、初始化事件派发器initApplicationEventMulticaster()
protectedvoidinitApplicationEventMulticaster(){
//1)、获取BeanFactory
ConfigurableListableBeanFactorybeanFactory=getBeanFactory();
//判断容器中是否有applicationEventMulticaster的这个bean,如果有获取,没有创建
if(beanFactory.containsLocalBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME)){
//2)、从BeanFactory中获取applicationEventMulticaster的ApplicationEventMulticaster;
this.applicationEventMulticaster=
beanFactory.getBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME,ApplicationEventMulticaster.class);
if(logger.isDebugEnabled()){
logger.debug("UsingApplicationEventMulticaster["+this.applicationEventMulticaster+"]");
}
}
else{
//3)个SimpleApplicationEventMulticaster类型的applicationEventMulticaster
this.applicationEventMulticaster=newSimpleApplicationEventMulticaster(beanFactory);
//4)、将创建的ApplicationEventMulticaster添加到BeanFactory中,以后其他组件直接自动注入
beanFactory.registerSingleton(APPLICATION_EVENT_MULTICASTER_BEAN_NAME,this.applicationEventMulticaster);
if(logger.isDebugEnabled()){
logger.debug("UnabletolocateApplicationEventMulticasterwithname'"+
APPLICATION_EVENT_MULTICASTER_BEAN_NAME+
"':usingdefault["+this.applicationEventMulticaster+"]");
}
}
}
9、onRefresh();留给子容器(子类)
1、子类重写AbstractApplicationContext.onRefresh()这个方法,在容器刷新的时候可以自定义逻辑;
10、registerListeners();检查和注册Listener
将所有项目里面的ApplicationListener注册到容器中;
protectedvoidregisterListeners(){
//1、从容器中拿到所有的ApplicationListener
for(ApplicationListener>listener:getApplicationListeners()){
//2、将每个监听器添加到事件派发器中;
getApplicationEventMulticaster().addApplicationListener(listener);
}
//1.获取所有的ApplicationListener
String[]listenerBeanNames=getBeanNamesForType(ApplicationListener.class,true,false);
for(StringlistenerBeanName:listenerBeanNames){
//2、将每个监听器添加到事件派发器中;
getApplicationEventMulticaster().addApplicationListenerBean(listenerBeanName);
}
//earlyApplicationEvents中保存之前的事件,
SetearlyEventsToProcess=this.earlyApplicationEvents;
this.earlyApplicationEvents=null;
if(earlyEventsToProcess!=null){
for(ApplicationEventearlyEvent:earlyEventsToProcess){
//3、派发之前步骤产生的事件;
getApplicationEventMulticaster().multicastEvent(earlyEvent);
}
}
}
11、初始化所有剩下的单实例bean;finishBeanFactoryInitialization(beanFactory);
protectedvoidfinishBeanFactoryInitialization(ConfigurableListableBeanFactorybeanFactory){
//类型装换器
if(beanFactory.containsBean(CONVERSION_SERVICE_BEAN_NAME)&&
beanFactory.isTypeMatch(CONVERSION_SERVICE_BEAN_NAME,ConversionService.class)){
beanFactory.setConversionService(
beanFactory.getBean(CONVERSION_SERVICE_BEAN_NAME,ConversionService.class));
}
//值解析器
if(!beanFactory.hasEmbeddedValueResolver()){
beanFactory.addEmbeddedValueResolver(newStringValueResolver(){
@Override
publicStringresolveStringValue(StringstrVal){
returngetEnvironment().resolvePlaceholders(strVal);
}
});
}
//InitializeLoadTimeWeaverAwarebeansearlytoallowforregisteringtheirtransformersearly.
String[]weaverAwareNames=beanFactory.getBeanNamesForType(LoadTimeWeaverAware.class,false,false);
for(StringweaverAwareName:weaverAwareNames){
getBean(weaverAwareName);
}
//StopusingthetemporaryClassLoaderfortypematching.
beanFactory.setTempClassLoader(null);
//Allowforcachingallbeandefinitionmetadata,notexpectingfurtherchanges.
beanFactory.freezeConfiguration();
//初始化剩下的单实例bean
beanFactory.preInstantiateSingletons();
}
11.1beanFactory.preInstantiateSingletons()初始化剩下的单实例bean
//preInstantiateSingletons():781,DefaultListableBeanFactory
publicvoidpreInstantiateSingletons()throwsBeansException{
if(this.logger.isDebugEnabled()){
this.logger.debug("Pre-instantiatingsingletonsin"+this);
}
//1)、获取容器中的所有Bean,依次进行初始化和创建对象
ListbeanNames=newArrayList(this.beanDefinitionNames);
for(StringbeanName:beanNames){
//2)、获取Bean的定义信息;RootBeanDefinition
RootBeanDefinitionbd=getMergedLocalBeanDefinition(beanName);
//3)、Bean不是抽象的,是单实例的,不是懒加载;
if(!bd.isAbstract()&&bd.isSingleton()&&!bd.isLazyInit()){
//3.1)、判断是否是FactoryBean;是否是实现FactoryBean接口的Bean;
if(isFactoryBean(beanName)){
finalFactoryBean>factory=(FactoryBean>)getBean(FACTORY_BEAN_PREFIX+beanName);
booleanisEagerInit;
if(System.getSecurityManager()!=null&&factoryinstanceofSmartFactoryBean){
isEagerInit=AccessController.doPrivileged(newPrivilegedAction(){
@Override
publicBooleanrun(){
return((SmartFactoryBean>)factory).isEagerInit();
}
},getAccessControlContext());
}
else{
isEagerInit=(factoryinstanceofSmartFactoryBean&&
((SmartFactoryBean>)factory).isEagerInit());
}
if(isEagerInit){
getBean(beanName);
}
}
else{//3.2)、不是工厂Bean。利用getBean(beanName);创建对象
getBean(beanName);//详情请见(11.1.3.2创建bean->doGetBean)章节
}
}
}
//循环所有的bean
for(StringbeanName:beanNames){
ObjectsingletonInstance=getSingleton(beanName);
//判断bean是否实现了SmartInitializingSingleton接口如果是;就执行afterSingletonsInstantiated();
if(singletonInstanceinstanceofSmartInitializingSingleton){
finalSmartInitializingSingletonsmartSingleton=(SmartInitializingSingleton)singletonInstance;
if(System.getSecurityManager()!=null){
AccessController.doPrivileged(newPrivilegedAction
11.1.3.2创建bean ->doGetBean
AbstractBeanFactory.doGetBean()方法
5)、将创建的Bean添加到缓存中singletonObjects;ioc容器就是这些Map;很多的Map里面保存了单实例Bean,环境信息。。。。;
protectedTdoGetBean( finalStringname,finalClass requiredType,finalObject[]args,booleantypeCheckOnly) throwsBeansException{ finalStringbeanName=transformedBeanName(name); Objectbean; /** 2、先获取缓存中保存的单实例Bean。如果能获取到说明这个Bean之前被创建过(所有创建过的单实例Bean都会被缓存起来) 从privatefinalMap singletonObjects=newConcurrentHashMap (256);获取的 **/ ObjectsharedInstance=getSingleton(beanName); //如果没有获取到创建bean if(sharedInstance!=null&&args==null){ if(logger.isDebugEnabled()){ if(isSingletonCurrentlyInCreation(beanName)){ logger.debug("Returningeagerlycachedinstanceofsingletonbean'"+beanName+ "'thatisnotfullyinitializedyet-aconsequenceofacircularreference"); } else{ logger.debug("Returningcachedinstanceofsingletonbean'"+beanName+"'"); } } bean=getObjectForBeanInstance(sharedInstance,name,beanName,null); } else{//3、缓存中获取不到,开始Bean的创建对象流程; //Failifwe'realreadycreatingthisbeaninstance: //We'reassumablywithinacircularreference. if(isPrototypeCurrentlyInCreation(beanName)){ thrownewBeanCurrentlyInCreationException(beanName); } //获取父beanFatory检查这个bean是否创建了 BeanFactoryparentBeanFactory=getParentBeanFactory(); if(parentBeanFactory!=null&&!containsBeanDefinition(beanName)){ //Notfound->checkparent. StringnameToLookup=originalBeanName(name); if(args!=null){ return(T)parentBeanFactory.getBean(nameToLookup,args); } else{ returnparentBeanFactory.getBean(nameToLookup,requiredType); } } //4、标记当前bean已经被创建 if(!typeCheckOnly){ markBeanAsCreated(beanName); } try{ //5、获取Bean的定义信息; finalRootBeanDefinitionmbd=getMergedLocalBeanDefinition(beanName); checkMergedBeanDefinition(mbd,beanName,args); //6、【获取当前Bean依赖的其他Bean;如果有按照getBean()把依赖的Bean先创建出来;】 String[]dependsOn=mbd.getDependsOn(); if(dependsOn!=null){ for(Stringdep:dependsOn){ if(isDependent(beanName,dep)){ thrownewBeanCreationException(mbd.getResourceDescription(),beanName, "Circulardepends-onrelationshipbetween'"+beanName+"'and'"+dep+"'"); } registerDependentBean(dep,beanName); getBean(dep);//先创建依赖的bean } } //启动单实例的bean的创建流程 if(mbd.isSingleton()){ //获取到单实例bean后,添加到缓存中singletonObjects() //Map singletonObjects=newConcurrentHashMap (256); sharedInstance=getSingleton(beanName,newObjectFactory
11.1.3.2.6.1创建单实例bean
AbstractAutowireCapableBeanFactory.createBean()这个类中
protectedObjectcreateBean(StringbeanName,RootBeanDefinitionmbd,Object[]args)throwsBeanCreationException{
if(logger.isDebugEnabled()){
logger.debug("Creatinginstanceofbean'"+beanName+"'");
}
RootBeanDefinitionmbdToUse=mbd;//bean定义信息
//解析bean的类型
Class>resolvedClass=resolveBeanClass(mbd,beanName);
if(resolvedClass!=null&&!mbd.hasBeanClass()&&mbd.getBeanClassName()!=null){
mbdToUse=newRootBeanDefinition(mbd);
mbdToUse.setBeanClass(resolvedClass);
}
//Preparemethodoverrides.
try{
mbdToUse.prepareMethodOverrides();
}
catch(BeanDefinitionValidationExceptionex){
thrownewBeanDefinitionStoreException(mbdToUse.getResourceDescription(),
beanName,"Validationofmethodoverridesfailed",ex);
}
try{
//让BeanPostProcessor先拦截返回代理对象;
/**判断是否为:InstantiationAwareBeanPostProcessor的,如果是执行前后置方法
【InstantiationAwareBeanPostProcessor】:提前执行;
先触发:postProcessBeforeInstantiation();
如果有返回值:再触发postProcessAfterInitialization();
**/
Objectbean=resolveBeforeInstantiation(beanName,mbdToUse);
if(bean!=null){//如果有对象返回
returnbean;
}
}
catch(Throwableex){
thrownewBeanCreationException(mbdToUse.getResourceDescription(),beanName,
"BeanPostProcessorbeforeinstantiationofbeanfailed",ex);
}
//没有对象创建一个bean
ObjectbeanInstance=doCreateBean(beanName,mbdToUse,args);
if(logger.isDebugEnabled()){
logger.debug("Finishedcreatinginstanceofbean'"+beanName+"'");
}
//返回创建的bean
returnbeanInstance;
}
1、doCreateBean()创建一个bean
后置处理器:MergedBeanDefinitionPostProcessor,bean实例化之后调用
//doCreateBean():508,AbstractAutowireCapableBeanFactory类中
protectedObjectdoCreateBean(finalStringbeanName,finalRootBeanDefinitionmbd,finalObject[]args)
throwsBeanCreationException{
//bean的包装
BeanWrapperinstanceWrapper=null;
if(mbd.isSingleton()){
instanceWrapper=this.factoryBeanInstanceCache.remove(beanName);
}
if(instanceWrapper==null){
//1)、【创建Bean实例】利用工厂方法或者对象的构造器创建出Bean实例;
instanceWrapper=createBeanInstance(beanName,mbd,args);
}
finalObjectbean=(instanceWrapper!=null?instanceWrapper.getWrappedInstance():null);
Class>beanType=(instanceWrapper!=null?instanceWrapper.getWrappedClass():null);
mbd.resolvedTargetType=beanType;
//Allowpost-processorstomodifythemergedbeandefinition.
synchronized(mbd.postProcessingLock){
if(!mbd.postProcessed){
try{
//调用MergedBeanDefinitionPostProcessor的postProcessMergedBeanDefinition(mbd,beanType,beanName);
//判断是否为:MergedBeanDefinitionPostProcessor类型的,如果是,调用方法
//MergedBeanDefinitionPostProcessor后置处理器是在bean实例换之后调用的
applyMergedBeanDefinitionPostProcessors(mbd,beanType,beanName);
}
catch(Throwableex){
thrownewBeanCreationException(mbd.getResourceDescription(),beanName,
"Post-processingofmergedbeandefinitionfailed",ex);
}
mbd.postProcessed=true;
}
}
//判断bean是否为单实例的,如果是单实例的添加到缓存中
booleanearlySingletonExposure=(mbd.isSingleton()&&this.allowCircularReferences&&
isSingletonCurrentlyInCreation(beanName));
if(earlySingletonExposure){
if(logger.isDebugEnabled()){
logger.debug("Eagerlycachingbean'"+beanName+
"'toallowforresolvingpotentialcircularreferences");
}
//添加bean到缓存中
addSingletonFactory(beanName,newObjectFactory(){
@Override
publicObjectgetObject()throwsBeansException{
returngetEarlyBeanReference(beanName,mbd,bean);
}
});
}
//Initializethebeaninstance.
ObjectexposedObject=bean;
try{
//为bean赋值,见1.1部分
populateBean(beanName,mbd,instanceWrapper);
if(exposedObject!=null){
//4)、【Bean初始化】
exposedObject=initializeBean(beanName,exposedObject,mbd);
}
}
catch(Throwableex){
if(exinstanceofBeanCreationException&&beanName.equals(((BeanCreationException)ex).getBeanName())){
throw(BeanCreationException)ex;
}
else{
thrownewBeanCreationException(
mbd.getResourceDescription(),beanName,"Initializationofbeanfailed",ex);
}
}
if(earlySingletonExposure){
//获取单实例bean,此时已经创建好了
ObjectearlySingletonReference=getSingleton(beanName,false);
if(earlySingletonReference!=null){
if(exposedObject==bean){
exposedObject=earlySingletonReference;
}
elseif(!this.allowRawInjectionDespiteWrapping&&hasDependentBean(beanName)){
String[]dependentBeans=getDependentBeans(beanName);
SetactualDependentBeans=newLinkedHashSet(dependentBeans.length);
for(StringdependentBean:dependentBeans){
if(!removeSingletonIfCreatedForTypeCheckOnly(dependentBean)){
actualDependentBeans.add(dependentBean);
}
}
if(!actualDependentBeans.isEmpty()){
thrownewBeanCurrentlyInCreationException(beanName,
"Beanwithname'"+beanName+"'hasbeeninjectedintootherbeans["+
StringUtils.collectionToCommaDelimitedString(actualDependentBeans)+
"]initsrawversionaspartofacircularreference,buthaseventuallybeen"+
"wrapped.Thismeansthatsaidotherbeansdonotusethefinalversionofthe"+
"bean.Thisisoftentheresultofover-eagertypematching-considerusing"+
"'getBeanNamesOfType'withthe'allowEagerInit'flagturnedoff,forexample.");
}
}
}
}
//5)、注册实现了DisposableBean接口Bean的销毁方法;只是注册没有去执行,容器关闭之后才去调用的
try{
registerDisposableBeanIfNecessary(beanName,bean,mbd);
}
catch(BeanDefinitionValidationExceptionex){
thrownewBeanCreationException(
mbd.getResourceDescription(),beanName,"Invaliddestructionsignature",ex);
}
returnexposedObject;
}
1.1populateBean()创建bean后属性赋值
//populateBean():1204,AbstractAutowireCapableBeanFactory
protectedvoidpopulateBean(StringbeanName,RootBeanDefinitionmbd,BeanWrapperbw){
PropertyValuespvs=mbd.getPropertyValues();
if(bw==null){
if(!pvs.isEmpty()){
thrownewBeanCreationException(
mbd.getResourceDescription(),beanName,"Cannotapplypropertyvaluestonullinstance");
}
else{
//Skippropertypopulationphasefornullinstance.
return;
}
}
//GiveanyInstantiationAwareBeanPostProcessorstheopportunitytomodifythe
//stateofthebeanbeforepropertiesareset.Thiscanbeused,forexample,
//tosupportstylesoffieldinjection.
booleancontinueWithPropertyPopulation=true;
//赋值之前:
/*1)、拿到InstantiationAwareBeanPostProcessor后置处理器;
执行处理器的postProcessAfterInstantiation();方法*/
if(!mbd.isSynthetic()&&hasInstantiationAwareBeanPostProcessors()){
for(BeanPostProcessorbp:getBeanPostProcessors()){
if(bpinstanceofInstantiationAwareBeanPostProcessor){
InstantiationAwareBeanPostProcessoribp=(InstantiationAwareBeanPostProcessor)bp;
//执行
if(!ibp.postProcessAfterInstantiation(bw.getWrappedInstance(),beanName)){
continueWithPropertyPopulation=false;
break;
}
}
}
}
if(!continueWithPropertyPopulation){
return;
}
if(mbd.getResolvedAutowireMode()==RootBeanDefinition.AUTOWIRE_BY_NAME||
mbd.getResolvedAutowireMode()==RootBeanDefinition.AUTOWIRE_BY_TYPE){
MutablePropertyValuesnewPvs=newMutablePropertyValues(pvs);
//autowire按name注入
if(mbd.getResolvedAutowireMode()==RootBeanDefinition.AUTOWIRE_BY_NAME){
autowireByName(beanName,mbd,bw,newPvs);
}
//autowire按类型注入
if(mbd.getResolvedAutowireMode()==RootBeanDefinition.AUTOWIRE_BY_TYPE){
autowireByType(beanName,mbd,bw,newPvs);
}
pvs=newPvs;
}
booleanhasInstAwareBpps=hasInstantiationAwareBeanPostProcessors();
booleanneedsDepCheck=(mbd.getDependencyCheck()!=RootBeanDefinition.DEPENDENCY_CHECK_NONE);
/*2)、拿到InstantiationAwareBeanPostProcessor后置处理器;
执行postProcessPropertyValues();获取到属性的值,此时还未赋值*/
if(hasInstAwareBpps||needsDepCheck){
PropertyDescriptor[]filteredPds=filterPropertyDescriptorsForDependencyCheck(bw,mbd.allowCaching);
if(hasInstAwareBpps){
for(BeanPostProcessorbp:getBeanPostProcessors()){
if(bpinstanceofInstantiationAwareBeanPostProcessor){
InstantiationAwareBeanPostProcessoribp=(InstantiationAwareBeanPostProcessor)bp;
pvs=ibp.postProcessPropertyValues(pvs,filteredPds,bw.getWrappedInstance(),beanName);
if(pvs==null){
return;
}
}
}
}
if(needsDepCheck){
checkDependencies(beanName,mbd,filteredPds,pvs);
}
}
//=====赋值之前:===
//3)、应用Bean属性的值;为属性利用setter方法等进行赋值;
applyPropertyValues(beanName,mbd,bw,pvs);
}
1.2、Bean初始化initializeBean
initializeBean():1605,AbstractAutowireCapableBeanFactory
//初始化
protectedObjectinitializeBean(finalStringbeanName,finalObjectbean,RootBeanDefinitionmbd){
if(System.getSecurityManager()!=null){
AccessController.doPrivileged(newPrivilegedAction(){
@Override
publicObjectrun(){
invokeAwareMethods(beanName,bean);
returnnull;
}
},getAccessControlContext());
}
else{
//1)、【执行Aware接口方法】invokeAwareMethods(beanName,bean);执行xxxAware接口的方法
//判断是否实现了BeanNameAware\BeanClassLoaderAware\BeanFactoryAware这些接口的bean,如果是执行相应的方法
invokeAwareMethods(beanName,bean);
}
ObjectwrappedBean=bean;
if(mbd==null||!mbd.isSynthetic()){
//2)、【执行后置处理器BeanPostProcessor初始化之前】执行所有的BeanPostProcessor.postProcessBeforeInitialization();
wrappedBean=applyBeanPostProcessorsBeforeInitialization(wrappedBean,beanName);
}
try{
//3)、【执行初始化方法】
invokeInitMethods(beanName,wrappedBean,mbd);
}
catch(Throwableex){
thrownewBeanCreationException(
(mbd!=null?mbd.getResourceDescription():null),
beanName,"Invocationofinitmethodfailed",ex);
}
//4)、【执行后置处理器初始化之后】执行所有的beanProcessor.postProcessAfterInitialization(result,beanName);方法
if(mbd==null||!mbd.isSynthetic()){
wrappedBean=applyBeanPostProcessorsAfterInitialization(wrappedBean,beanName);
}
returnwrappedBean;
}
1.2.1 执行bean的初始化方法init
1)、是否是InitializingBean接口的实现;执行接口规定的初始化;
2)、是否自定义初始化方法;通过注解的方式添加了initMethod方法的,
例如:@Bean(initMethod="init",destroyMethod="detory")
//invokeInitMethods():1667,AbstractAutowireCapableBeanFactory
protectedvoidinvokeInitMethods(StringbeanName,finalObjectbean,RootBeanDefinitionmbd)
throwsThrowable{
//1)、是否是InitializingBean接口的实现;执行接口规定的初始化,执行afterPropertiesSet()这个方法;
booleanisInitializingBean=(beaninstanceofInitializingBean);
if(isInitializingBean&&(mbd==null||!mbd.isExternallyManagedInitMethod("afterPropertiesSet"))){
if(logger.isDebugEnabled()){
logger.debug("InvokingafterPropertiesSet()onbeanwithname'"+beanName+"'");
}
if(System.getSecurityManager()!=null){
try{
AccessController.doPrivileged(newPrivilegedExceptionAction(){
@Override
publicObjectrun()throwsException{
((InitializingBean)bean).afterPropertiesSet();
returnnull;
}
},getAccessControlContext());
}
catch(PrivilegedActionExceptionpae){
throwpae.getException();
}
}
else{
//执行实现InitializingBean的afterPropertiesSet方法
((InitializingBean)bean).afterPropertiesSet();
}
}
if(mbd!=null){
//执行通过注解自定义的initMethod方法
StringinitMethodName=mbd.getInitMethodName();
if(initMethodName!=null&&!(isInitializingBean&&"afterPropertiesSet".equals(initMethodName))&&
!mbd.isExternallyManagedInitMethod(initMethodName)){
invokeCustomInitMethod(beanName,bean,mbd);
}
}
}
12、完成BeanFactory的初始化创建工作;IOC容器就创建完成;刷新
protectedvoidfinishRefresh(){
//1.初始化生命周期有关的后置处理器,BeanFactory创建完成后刷新相关的工作
//默认从容器中找是否有lifecycleProcessor的组件【LifecycleProcessor】;如果没有newDefaultLifecycleProcessor();加入到容器;
initLifecycleProcessor();
//2.拿到前面定义的生命周期处理器(LifecycleProcessor);回调onRefresh();
getLifecycleProcessor().onRefresh();
//3.发布容器刷新完成事件;
publishEvent(newContextRefreshedEvent(this));
//4.暴露
LiveBeansView.registerApplicationContext(this);
}
二、Spring启动流程的总结
1)、Spring容器在启动的时候,先会保存所有注册进来的Bean的定义信息;
1)、xml注册bean;
2)、注解注册Bean;@Service、@Component、@Bean、xxx
2)、Spring容器会合适的时机创建这些Bean
1)、用到这个bean的时候;利用getBean创建bean;创建好以后保存在容器中;
2)、统一创建剩下所有的bean的时候;finishBeanFactoryInitialization();
3)、后置处理器;BeanPostProcessor
1)、每一个bean创建完成,都会使用各种后置处理器进行处理;来增强bean的功能;
AutowiredAnnotationBeanPostProcessor:处理自动注入
AnnotationAwareAspectJAutoProxyCreator:来做AOP功能;
xxx....
增强的功能注解:
AsyncAnnotationBeanPostProcessor
....
4)、事件驱动模型;
ApplicationListener;事件监听;
ApplicationEventMulticaster;事件派发:
总结
到此这篇关于Spring启动流程refresh()源码深入解析的文章就介绍到这了,更多相关Spring启动流程refresh()源码内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。