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(); }