Spring 容器初始化(refresh过程)
2010-11-04 09:47
405 查看
Spring 运行机制一刷新Spring上下文
准备更新prepareRefresh()
通过obtainFreshBeanFactory()方法获取ConfigurableListableBeanFactory
invokeBeanFactoryPostProcessors()实例化和调用所用注册了BeanFactoryPostProcessor的beans,执行时候按照顺序,必须在实例化单例之前调用例子:如果一个bean实现BeanFactoryPostProcessor 则它在beanFactory创建后就立即创建了,并且可以改变beanFactory的属性,通过它也可以做一些扩张工作
初始化消息资源,如果该类没有就是用父context的
Initialize the ApplicationEventMulticaster. Uses SimpleApplicationEventMulticaster if none defined in the context初始化ApplicationEventMulticaster,如果没定义则是用SimpleApplicationEventMulticaster
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(); }本文出自 “谦受益” 博客,请务必保留此出处http://ganludong.blog.51cto.com/801200/415037
相关文章推荐
- Spring 容器初始化(refresh过程)
- Spring源码解析之零 ------ 容器初始化过程(refresh()方法)概要
- Spring容器初始化过程
- Spring原理(一)IoC容器的初始化过程之BeanFactory
- spring笔记6 容器加载过程、bean初始化
- Spring学习06--IOC实现原理以及IOC容器初始化过程
- Spring 容器IOC的初始化过程
- Spring原理-IoC容器初始化过程
- spring源码研究之IoC容器在web容器中初始化过程
- Spring容器初始化过程都做了哪些事儿
- spring源码分析-web容器初始化过程解析1
- spring容器初始化,bean加载生成过程,源码解析学习
- Spring容器初始化过程
- spring源码学习之路---深度分析IOC容器初始化过程(四)
- spring源码学习之路---深度分析IOC容器初始化过程(四)
- 【Spring】IOC核心源码学习(二):容器初始化过程
- spring注解和springmvc容器初始化过程
- 源码解读(一): spring在web容器中的初始化过程
- Spring IoC(二)IoC容器的初始化过程
- spring源码学习之路---深度分析IOC容器初始化过程(四)