




已阅读5页,还剩4页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Spring源码解析-applicationContextDemouml类图ApplicationContextApplicationListener源码解析主流程obtainFreshBeanFactoryprepareBeanFactoryinvokeBeanFactoryPostProcessorsregisterBeanPostProcessorsregisterListenersfinishRefresh总结在已经有BeanFactory可以完成Ioc功能情况下,spring又提供了ApplicationContext,why?可以简单理解BeanFactory为可用,ApplicationContext封装了Beanfactory,提供了上下文、国际化、监听等更多的可选功能,让其能用,使用时,优先使用ApplicationContext。Demo跟beanfactory的demo唯一不同的就是:/BeanFactory ctx = new XmlBeanFactory(new ClassPathResource(spring.xml);ApplicationContext ctx = new ClassPathXmlApplicationContext(spring.xml);uml类图ApplicationContextapplicationContextApplicationListenerApplicationListener源码解析主流程/ClassPathXmlApplicationContextpublic ClassPathXmlApplicationContext(String configLocations, boolean refresh) throws BeansException this(configLocations, refresh, null);public ClassPathXmlApplicationContext(String configLocations, boolean refresh, ApplicationContext parent) throws BeansException super(parent); / 设置configLocations setConfigLocations(configLocations); if (refresh) refresh(); /AbstractApplicationContextpublic void refresh() throws BeansException, IllegalStateException synchronized (this.startupShutdownMonitor) / 设置和校验系统变量和环境变量的值 prepareRefresh(); / 获取beanFactory ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory(); / 配置BeanFactory上下文 prepareBeanFactory(beanFactory); try / 子类扩展,beanFactory的后置处理 postProcessBeanFactory(beanFactory); / 调用BeanFactory的后置处理器 invokeBeanFactoryPostProcessors(beanFactory); / 注册bean processors,只是注册,bean创建时调用. registerBeanPostProcessors(beanFactory); / 国际化 initMessageSource(); / 初始化监听的Multicaster,有自定义就是用自定义,没有就使用默认SimpleApplicationEventMulticaster initApplicationEventMulticaster(); / 子类扩展 onRefresh(); / 注册listen registerListeners(); / 实例化所有非延迟加载的bean,相当于循环调用getbean finishBeanFactoryInitialization(beanFactory); / 完成刷新,通知LifecycleProcessor,ContextRefreshedEvent事件(这个很有用,可以监听这个事件) finishRefresh(); catch (BeansException ex) / Destroy already created singletons to avoid dangling resources. destroyBeans(); / Reset active flag. cancelRefresh(ex); / Propagate exception to caller. throw ex; 整个refresh过程,流程清晰,从spring学了这一招。obtainFreshBeanFactory这个流程里面有个需要注意的地方:/AbstractRefreshableApplicationContextprotected void customizeBeanFactory(DefaultListableBeanFactory beanFactory) if (this.allowBeanDefinitionOverriding != null) beanFactory.setAllowBeanDefinitionOverriding(this.allowBeanDefinitionOverriding); if (this.allowCircularReferences != null) beanFactory.setAllowCircularReferences(this.allowCircularReferences); / 用于Autowire和Qualifier,没试过,TODO beanFactory.setAutowireCandidateResolver(new QualifierAnnotationAutowireCandidateResolver();prepareBeanFactory/ClassPathXmlApplicationContextprotected void prepareBeanFactory(ConfigurableListableBeanFactory beanFactory) / Tell the internal bean factory to use the contexts class loader etc. beanFactory.setBeanClassLoader(getClassLoader(); / 之前beanfactory没有设置classLoader beanFactory.setBeanExpressionResolver(new StandardBeanExpressionResolver(); / el表达式 beanFactory.addPropertyEditorRegistrar(new ResourceEditorRegistrar(this, this.getEnvironment(); / 配置属性注入编辑器 /ApplicationContextAwareProcessor这个beanpostprocessor,在实例化前postProcessBeforeInitialization设置下面忽略的依赖 beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(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类加载期织入支持Detect a LoadTimeWeaver and prepare for weaving, if found. if (beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME) beanFactory.addBeanPostProcessor(new LoadTimeWeaverAwareProcessor(beanFactory); / Set a temporary ClassLoader for type matching. beanFactory.setTempClassLoader(new ContextTypeMatchClassLoader(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激活调用protected void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory) / Invoke BeanDefinitionRegistryPostProcessors first, if any. Set processedBeans = new HashSet(); /BeanDefinitionRegistry中的BeanPostProcessor if (beanFactory instanceof BeanDefinitionRegistry) BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory; List regularPostProcessors = new LinkedList(); List registryPostProcessors = new LinkedList(); /硬编码进来的 for (BeanFactoryPostProcessor postProcessor : getBeanFactoryPostProcessors() if (postProcessor instanceof BeanDefinitionRegistryPostProcessor) /BeanDefinitionRegistryPostProcessor继承了BeanFactoryPostProcessor,多了个调用postProcessBeanDefinitionRegistry,这里区分下 BeanDefinitionRegistryPostProcessor registryPostProcessor = (BeanDefinitionRegistryPostProcessor) postProcessor; registryPostProcessor.postProcessBeanDefinitionRegistry(registry); registryPostProcessors.add(registryPostProcessor); else regularPostProcessors.add(postProcessor); /配置的bean中获取 Map beanMap = beanFactory.getBeansOfType(BeanDefinitionRegistryPostProcessor.class, true, false); List registryPostProcessorBeans = new ArrayList(beanMap.values(); OrderComparator.sort(registryPostProcessorBeans); for (BeanDefinitionRegistryPostProcessor postProcessor : registryPostProcessorBeans) /调用postProcessBnDefinitionRegistry postProcessor.postProcessBeanDefinitionRegistry(registry); /调用postProcessBeanFactory invokeBeanFactoryPostProcessors(registryPostProcessors, beanFactory); invokeBeanFactoryPostProcessors(registryPostProcessorBeans, beanFactory); invokeBeanFactoryPostProcessors(regularPostProcessors, beanFactory); / processedBeans包含所有处理过的 processedBeans.addAll(beanMap.keySet(); else / Invoke factory processors registered with the context instance. invokeBeanFactoryPostProcessors(getBeanFactoryPostProcessors(), beanFactory); / beanFactory中获取BeanFactoryPostProcessor String postProcessorNames = beanFactory.getBeanNamesForType(BeanFactoryPostProcessor.class, true, false); / Separate between BeanFactoryPostProcessors that implement PriorityOrdered, / Ordered, and the rest. List priorityOrderedPostProcessors = new ArrayList(); List orderedPostProcessorNames = new ArrayList(); List nonOrderedPostProcessorNames = new ArrayList(); for (String ppName : postProcessorNames) / 按照PriorityOrderedOrdered其他区分下,如果已经处理过,会过滤掉,不会重复处理 if (processedBeans.contains(ppName) / skip - already processed in first phase above else if (isTypeMatch(ppName, PriorityOrdered.class) priorityOrderedPostProcessors.add(beanFactory.getBean(ppName, BeanFactoryPostProcessor.class); else if (isTypeMatch(ppName, Ordered.class) orderedPostProcessorNames.add(ppName); else nonOrderedPostProcessorNames.add(ppName); / 对分类过的排序然后调用 / First, invoke the BeanFactoryPostProcessors that implement PriorityOrdered. OrderComparator.sort(priorityOrderedPostProcessors); invokeBeanFactoryPostProcessors(priorityOrderedPostProcessors, beanFactory); / Next, invoke the BeanFactoryPostProcessors that implement Ordered. List orderedPostProcessors = new ArrayList(); for (String postProcessorName : orderedPostProcessorNames) orderedPostProcessors.add(getBean(postProcessorName, BeanFactoryPostProcessor.class); OrderComparator.sort(orderedPostProcessors); invokeBeanFactoryPostProcessors(orderedPostProcessors, beanFactory); / Finally, invoke all other BeanFactoryPostProcessors. List nonOrderedPostProcessors = new ArrayList(); for (String postProcessorName : nonOrderedPostProcessorNames) nonOrderedPostProcessors.add(getBean(postProcessorName, BeanFactoryPostProcessor.class); invokeBeanFactoryPostProcessors(nonOrderedPostProcessors, beanFactory);registerBeanPostProcessors/AbstractApplicationContext/注册所有的BeanPostProcessor,只注册,不调用protected void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory) String postProcessorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false); / 注册BeanPostProcessorChecker,只是info日志表明bean没有被所有processor处理,没感觉想干嘛 int beanProcessorTargetCount = beanFactory.getBeanPostProcessorCount() + 1 + postProcessorNames.length; beanFactory.addBeanPostProcessor(new BeanPostProcessorChecker(beanFactory, beanProcessorTargetCount); / 按照实现PriorityOrdered,Ordered,其他.分类排序注册到beanfactory List priorityOrderedPostProcessors = new ArrayList(); List internalPostProcessors = new ArrayList(); List orderedPostProcessorNames = new ArrayList(); List nonOrderedPostProcessorNames = new ArrayList(); for (String ppName : postProcessorNames) if (isTypeMatch(ppName, PriorityOrdered.class) BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class); priorityOrderedPostProcessors.add(pp); if (pp instanceof MergedBeanDefinitionPostProcessor) internalPostProcessors.add(pp); else if (isTypeMatch(ppName, Ordered.class) orderedPostProcessorNames.add(ppName); else nonOrderedPostProcessorNames.add(ppName); / First, register the BeanPostProcessors that implement PriorityOrdered. OrderComparator.sort(priorityOrderedPostProcessors); registerBeanPostProcessors(beanFactory, priorityOrderedPostProcessors); / Next, register the BeanPostProcessors that implement Ordered. List orderedPostProcessors = new ArrayList(); for (String ppName : orderedPostProcessorNames) BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class); orderedPostProcessors.add(pp); if (pp instanceof MergedBeanDefinitionPostProcessor) internalPostProcessors.add(pp); OrderComparator.sort(orderedPostProcessors); registerBeanPostProcessors(beanFactory, orderedPostProcessors); / Now, register all regular BeanPostProcessors. List nonOrderedPostProcessors = new ArrayList(); for (String ppName : nonOrderedPostProcessorNames) BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class); nonOrderedPostProcessors.add(pp); if (pp instanceof MergedBeanDefinitionPostProcessor) internalPostProcessors.add(pp); registerBeanPostProcessors(beanFactory, nonOrderedPostProcessors); / Finally, re-register all internal BeanPostProcessors. OrderComparator.sort(internalPostProcessors); registerBeanPostProcessors(beanFactory, internalPostProcessors); /ApplicationListenerDetector初始化后,如果是liste
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 公司团委中秋节活动方案
- 公司团年酒水活动方案
- 公司团建做饭策划方案
- 公司团建家庭日活动方案
- 公司团建永嘉活动方案
- 公司团建田间活动方案
- 公司团建青城山活动方案
- 公司团聚一堂活动方案
- 公司团队跨年夜活动方案
- 公司圣诞节团建活动方案
- 2024年攀枝花市仁和区向招考社区工作者真题
- BIM在公路工程中的三维可视化应用-洞察阐释
- 离散数学考试题及答案
- 安徽省安庆望江县联考2025年七年级英语第二学期期中质量检测模拟试题含答案
- 2024-2025学年人教版数学一年级下学期期末模拟试卷(含答案)
- 安徽省合肥一中2025届高三最后一卷英语试题及答案
- 有关工厂实习心得体会模版
- 2025年江苏省苏州吴中、吴江、相城区初三英语一模试题及答案
- 2025年组织行为学专业考试试题及答案
- 智能化汽车中的专利战略布局-洞察阐释
- 不寐的中医护理常规
评论
0/150
提交评论