Spring 容器初始化(refresh過程)

 

Spring 運行機制一
刷新Spring上下文
publicvoid refresh()throws BeansException, IllegalStateException
{
synchronized(startupShutdownMonitor)
{
prepareRefresh(); //設置標識標識正在執行中線程同步
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();//關閉舊的beanfactory ,獲取一個新的beanfactory,讀取配置文件等操作
prepareBeanFactory(beanFactory); //給beanfactory注入一些初始化組件比如 bean的類加載器
try
{
postProcessBeanFactory(beanFactory); //修改applicationContext內部beanfactory
invokeBeanFactoryPostProcessors(beanFactory); //調用BeanFactoryPostProcessors
registerBeanPostProcessors(beanFactory);//設置ApplicationContext中的beanFactoryPostProcessors變量表示:該ApplicationContext中共有多少個beanFactoryPostProcessor
initMessageSource();//爲自己和父上下文賦或者初始化了一個單例的MessageSourcebean
initApplicationEventMulticaster();
//初始化ApplicationEventMulticaster,如果沒定義則是用SimpleApplicationEventMulticaster
它會進行廣播所以在listenner中一定要進行event的判斷
onRefresh(); //爲了擴展而預留的
registerListeners();//重新註冊監聽器
finishBeanFactoryInitialization(beanFactory);
finishRefresh(); //發送一個Event給Listenner
}
catch(BeansException ex)
{
beanFactory.destroySingletons();
cancelRefresh(ex);
throw ex;
}
}
}

 

 

準備更新prepareRefresh()
protected void prepareRefresh()
{
startupDate = System.currentTimeMillis(); //設置啓動時間
synchronized(activeMonitor) //同步監視器
{
active = true; //設置爲準備啓動啦
}
if(logger.isInfoEnabled())
logger.info("Refreshing " + this);
}

 

通過obtainFreshBeanFactory()方法獲取ConfigurableListableBeanFactory

 

protected ConfigurableListableBeanFactory obtainFreshBeanFactory()
{
refreshBeanFactory();
protected final void refreshBeanFactory()
throws BeansException
{
if(hasBeanFactory()) //若果存在
{
destroyBeans();//銷燬已經存在的bean
closeBeanFactory(); //關閉bean工廠
}
try
{
DefaultListableBeanFactory beanFactory = createBeanFactory();
protected DefaultListableBeanFactory createBeanFactory()
{
return new DefaultListableBeanFactory(getInternalParentBeanFactory());
}
customizeBeanFactory(beanFactory);
protected void customizeBeanFactory(DefaultListableBeanFactory beanFactory)
{
if(allowBeanDefinitionOverriding != null)
beanFactory.setAllowBeanDefinitionOverriding(allowBeanDefinitionOverriding.booleanValue());
if(allowCircularReferences != null)
beanFactory.setAllowCircularReferences(allowCircularReferences.booleanValue());
}
loadBeanDefinitions(beanFactory); //這裏以後單獨看 太多啦
synchronized(beanFactoryMonitor)
{
this.beanFactory = beanFactory;
}
}
catch(IOException ex)
{
throw new ApplicationContextException("I/O error parsing XML document for application context [" + getDisplayName() + "]", ex);
}
}
ConfigurableListableBeanFactory beanFactory = getBeanFactory();
public final ConfigurableListableBeanFactory getBeanFactory()
{
Object obj = beanFactoryMonitor;
JVM INSTR monitorenter ;
if(beanFactory == null)
throw new IllegalStateException("BeanFactory not initialized or already closed - call 'refresh' before accessing beans via the ApplicationContext");
return beanFactory; //就是剛剛 refreshBeanFactory出來的beanfactory
Exception exception;
exception;
throw exception;
}
if(logger.isInfoEnabled())
logger.info("Bean factory for application context [" + getId() + "]: " + ObjectUtils.identityToString(beanFactory));
if(logger.isDebugEnabled())
logger.debug(beanFactory.getBeanDefinitionCount() + " beans defined in " + this);
return beanFactory;
}

 

protected ConfigurableListableBeanFactory obtainFreshBeanFactory(){
refreshBeanFactory();
ConfigurableListableBeanFactory beanFactory = getBeanFactory();
if(logger.isInfoEnabled())
logger.info("Bean factory for application context [" + getId() + "]: " + ObjectUtils.identityToString(beanFactory));
if(logger.isDebugEnabled())
logger.debug(beanFactory.getBeanDefinitionCount() + " beans defined in " + this);
return beanFactory;
}
protected final void refreshBeanFactory() throws BeansException{
if(hasBeanFactory()){//若果存在
destroyBeans();//銷燬已經存在的bean
closeBeanFactory(); //關閉bean工廠
}
try
{
DefaultListableBeanFactory beanFactory = createBeanFactory();
customizeBeanFactory(beanFactory);
loadBeanDefinitions(beanFactory); //這裏以後單獨看 太多啦
synchronized(beanFactoryMonitor)
{
this.beanFactory = beanFactory;
}
}catch(IOException ex){
throw new ApplicationContextException("I/O error parsing XML document for application context [" + getDisplayName() + "]", ex);
}
}
public final ConfigurableListableBeanFactory getBeanFactory(){
Object obj = beanFactoryMonitor;
JVM INSTR monitorenter ;
if(beanFactory == null)
throw new IllegalStateException("BeanFactory not initialized or already closed - call 'refresh' before accessing beans via the ApplicationContext");
return beanFactory; //就是剛剛 refreshBeanFactory出來的beanfactory
Exception exception;
exception;
throw exception;
}
protected DefaultListableBeanFactory createBeanFactory(){
return new DefaultListableBeanFactory(getInternalParentBeanFactory());
}
protected void customizeBeanFactory(DefaultListableBeanFactory beanFactory){
if(allowBeanDefinitionOverriding != null)
beanFactory.setAllowBeanDefinitionOverriding(allowBeanDefinitionOverriding.booleanValue());
if(allowCircularReferences != null)
beanFactory.setAllowCircularReferences(allowCircularReferences.booleanValue());
}
上一步吧BeanFactory給創建出來了現在要做一些以後工作的準備工作

 

public static ClassLoader getDefaultClassLoader()
{
ClassLoader cl = null;
try
{
cl = Thread.currentThread().getContextClassLoader();
}
catch(Throwable ex) { }
if(cl == null)//判斷線程上下文的類加載器被手動設置爲NULL沒有
cl = (org.springframework.util.ClassUtils.class).getClassLoader();
return cl;
}

 

protected void prepareBeanFactory(ConfigurableListableBeanFactory beanFactory)
{
beanFactory.setBeanClassLoader(getClassLoader()); //bean的類加載器默認是使用的正在使用的類加載器
beanFactory.addPropertyEditorRegistrar(new ResourceEditorRegistrar(this)); //增加一個處理文件資源的屬性編輯器
beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this));
//爲工廠添加一個Bean創建後處理器主要處理: passes the ApplicationContext to beans that implement the ResourceLoaderAware, ApplicationEventPublisherAware, MessageSourceAware and/or ApplicationContextAware interfaces
beanFactory.ignoreDependencyInterface(org.springframework.context.ResourceLoaderAware.class);
beanFactory.ignoreDependencyInterface(org.springframework.context.ApplicationEventPublisherAware.class);
beanFactory.ignoreDependencyInterface(org.springframework.context.MessageSourceAware.class);
beanFactory.ignoreDependencyInterface(org.springframework.context.ApplicationContextAware.class);
//在使用自動組裝(autoWrite)方式創建bean的時候忽略上述注入的接口
beanFactory.registerResolvableDependency(org.springframework.beans.factory.BeanFactory.class, beanFactory);
//大概意思是:如果注入的時候參數類型是第一個參數,則注入第二個參數作爲注入的對象
beanFactory.registerResolvableDependency(org.springframework.core.io.ResourceLoader.class, this);
beanFactory.registerResolvableDependency(org.springframework.context.ApplicationEventPublisher.class, this);
beanFactory.registerResolvableDependency(org.springframework.context.ApplicationContext.class, this);
//增加loadTimeWeaver功能通過 instrumentation 的動態字節碼增強在裝載期向 domain object 中注入依賴
if(beanFactory.containsBean("loadTimeWeaver ") && JdkVersion.isAtLeastJava15())
{
try
{
Class ltwapClass = ClassUtils.forName("org.springframework.context.weaving.LoadTimeWeaverAwareProcessor", (org.springframework.context.support.AbstractApplicationContext.class).getClassLoader());
BeanPostProcessor ltwap = (BeanPostProcessor)BeanUtils.instantiateClass(ltwapClass);
((BeanFactoryAware)ltwap).setBeanFactory(beanFactory);
beanFactory.addBeanPostProcessor(ltwap);
}
catch(ClassNotFoundException ex)
{
throw new IllegalStateException("Spring's LoadTimeWeaverAwareProcessor class is not available");
}
beanFactory.setTempClassLoader(new ContextTypeMatchClassLoader(beanFactory.getBeanClassLoader()));
}
}
預留方法postProcessBeanFactory() 用戶擴展修改beanfactory的設置

 

protected void postProcessBeanFactory(ConfigurableListableBeanFactory configurablelistablebeanfactory){
}

 

invokeBeanFactoryPostProcessors()
實例化和調用所用註冊了BeanFactoryPostProcessor的beans,執行時候按照順序,必須在實例化單例之前調用
例子:如果一個bean實現BeanFactoryPostProcessor 則它在beanFactory創建後就立即創建了,並且可以改變beanFactory的屬性,通過它也可以做一些擴張工作

 

protected void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory)
{
BeanFactoryPostProcessor factoryProcessor;
for(Iterator it = getBeanFactoryPostProcessors().iterator(); it.hasNext(); factoryProcessor.postProcessBeanFactory(beanFactory))
factoryProcessor = (BeanFactoryPostProcessor)it.next();
//調用了 bean的postProcessBeanFactory方法第一次爲空getBeanFactoryPostProcessors().iterator()
//第二次調用則是old的BeanFactoryPostProcessor 下面將添加一些新的容
String postProcessorNames[] = beanFactory.getBeanNamesForType(org.springframework.beans.factory.config.BeanFactoryPostProcessor.class, true, false);
List priorityOrderedPostProcessors = new ArrayList();
List orderedPostProcessorNames = new ArrayList();
List nonOrderedPostProcessorNames = new ArrayList();
for(int i = 0; i < postProcessorNames.length; i++)
{
if(isTypeMatch(postProcessorNames[i], org.springframework.core.PriorityOrdered.class))
{
priorityOrderedPostProcessors.add(beanFactory.getBean(postProcessorNames[i]));
continue;
}
if(isTypeMatch(postProcessorNames[i], org.springframework.core.Ordered.class))
orderedPostProcessorNames.add(postProcessorNames[i]);
else
nonOrderedPostProcessorNames.add(postProcessorNames[i]);
}
//上面這種顏色表示的代碼是在對BeanFactoryPostProcessor進行分類下面進行調用
Collections.sort(priorityOrderedPostProcessors, new OrderComparator());
invokeBeanFactoryPostProcessors(beanFactory, priorityOrderedPostProcessors);
List orderedPostProcessors = new ArrayList();
String postProcessorName;
for(Iterator it = orderedPostProcessorNames.iterator(); it.hasNext(); orderedPostProcessors.add(getBean(postProcessorName)))
postProcessorName = (String)it.next();
Collections.sort(orderedPostProcessors, new OrderComparator());
invokeBeanFactoryPostProcessors(beanFactory, orderedPostProcessors);
List nonOrderedPostProcessors = new ArrayList();
String postProcessorName;
for(Iterator it = nonOrderedPostProcessorNames.iterator(); it.hasNext(); nonOrderedPostProcessors.add(getBean(postProcessorName)))
postProcessorName = (String)it.next();
invokeBeanFactoryPostProcessors(beanFactory, nonOrderedPostProcessors);
}

 

初始化消息資源,如果該類沒有就是用父context的

 

protected void initMessageSource()
{
ConfigurableListableBeanFactory beanFactory = getBeanFactory();
if(beanFactory.containsLocalBean("messageSource"))
{
messageSource = (MessageSource)beanFactory.getBean("messageSource", org.springframework.context.MessageSource.class);
if(parent != null && (messageSource instanceof HierarchicalMessageSource))
{
// HierarchicalMessageSource可以設置父親的messageSource  默認是true
HierarchicalMessageSource hms = (HierarchicalMessageSource)messageSource;
if(hms.getParentMessageSource() == null)
hms.setParentMessageSource(getInternalParentMessageSource());
}
if(logger.isDebugEnabled())
logger.debug("Using MessageSource [" + messageSource + "]");
} else
{
DelegatingMessageSource dms = new DelegatingMessageSource();
dms.setParentMessageSource(getInternalParentMessageSource());
messageSource = dms;
beanFactory.registerSingleton("messageSource", messageSource);
if(logger.isDebugEnabled())
logger.debug("Unable to locate MessageSource with name 'messageSource': using default [" + messageSource + "]");
}
}
//就是賦值給自己和父類。在beanfactory中裝一個MessageSource的單例bean

 

Initialize the ApplicationEventMulticaster. Uses SimpleApplicationEventMulticaster if none defined in the context
初始化ApplicationEventMulticaster,如果沒定義則是用SimpleApplicationEventMulticaster

 

protected void initApplicationEventMulticaster()
{
ConfigurableListableBeanFactory beanFactory = getBeanFactory();
//只從自己的中拿不從父親那裏來applicationEventMulticaster
if(beanFactory.containsLocalBean("applicationEventMulticaster"))
{
applicationEventMulticaster = (ApplicationEventMulticaster)beanFactory.getBean("applicationEventMulticaster", org.springframework.context.event.ApplicationEventMulticaster.class);
if(logger.isDebugEnabled())
logger.debug("Using ApplicationEventMulticaster [" + applicationEventMulticaster + "]");
} else
{
applicationEventMulticaster = new SimpleApplicationEventMulticaster();
beanFactory.registerSingleton("applicationEventMulticaster", applicationEventMulticaster);
if(logger.isDebugEnabled())
logger.debug("Unable to locate ApplicationEventMulticaster with name 'applicationEventMulticaster': using default [" + applicationEventMulticaster + "]");
}
}
註釋:
public interface ApplicationEventMulticaster :Interface to be implemented by objects that can manage a number of ApplicationListeners, and publish events to them.
以後的英文就不翻譯了太難得寫了哈哈直接貼出來哈
registerListeners():
Add beans that implement ApplicationListener as listeners. Doesn't affect other listeners, which can be added without being beans.
protected void addListener(ApplicationListener listener)
{
//這個就是上一步創建的
getApplicationEventMulticaster().addApplicationListener(listener);
}

 

protected void registerListeners()
{
for(Iterator it = getApplicationListeners().iterator(); it.hasNext(); addListener((ApplicationListener)it.next()));
//以前的Listenner
Collection listenerBeans =
getBeansOfType(org.springframework.context.ApplicationListener.class, true, false).values();
for(Iterator it = listenerBeans.iterator(); it.hasNext(); addListener((ApplicationListener)it.next()));
}
finishBeanFactoryInitialization ():
Finish the initialization of this context's bean factory, initializing all remaining singleton beans.

 

public void preInstantiateSingletons()        throws BeansException
{
if(logger.isInfoEnabled())
logger.info("Pre-instantiating singletons in " + this);
synchronized(beanDefinitionMap)
{
Iterator it = beanDefinitionNames.iterator();
do
{
if(!it.hasNext())
break;
String beanName = (String)it.next();
//Returna merged RootBeanDefinition, traversing the parent bean definition if the specified bean corresponds to a child bean definition
RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);
if(!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit())
if(isFactoryBean(beanName))
{
FactoryBean factory = (FactoryBean)getBean("&" + beanName);
if((factory instanceof SmartFactoryBean) && ((SmartFactoryBean)factory).isEagerInit())
getBean(beanName);
} else
{
getBean(beanName);
}
} while(true);
}
}

 

protected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory)
{
beanFactory.setTempClassLoader(null); //設置臨時類加載器
beanFactory.freezeConfiguration();//  Freeze all bean definitions, signalling that the registered bean definitions will not be modified or post-processed any further
beanFactory.preInstantiateSingletons();

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章