




已阅读5页,还剩2页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2.3.1 BeanDefinition的Resource定位以编程的方式使用DefaultListableBeanFactory时,我们可以看到,首先定义一个Resource来定位容器使用的BeanDefinition。这时使用的是ClassPathResource,意味着Spring会在类路径中寻找以文件形式存在的BeanDefinition信息。ClassPathResource res = new ClassPathResource(beans.xml);这个定义的Resource并不能让DefaultListableBeanFactory直接使用,Spring是通过BeanDefinitionReader来对这些信息进行处理的。在这里,我们也可以看到使用ApplicationContext相对于直接使用DefaultListableBeanFactory的好处。因为在ApplicationContext中,Spring已经为我们提供了一系列加载不同Resource的读取器的实现,而DefaultListableBeanFactory只是一个纯粹的IoC容器,需要为它配置特定的读取器才能完成这些功能。当然,有利就有弊,使用DefaultListableBeanFactory这种更底层的容器,却能提高我们定制IoC容器的灵活性。回到我们经常使用的ApplicationContext上来,例如FileSystemXmlApplication-Context、ClassPathXmlApplicationContext以及XmlWebApplicationContext等。简单地从这些类的名字上分析,可以清楚地看到它们可以提供哪些不同的Resource读入功能,比如FileSystemXmlApplicationContext可以从文件系统载入Resource,ClassPathXm-lApplicationContext可以从Class Path载入Resource,XmlWebApplicationContext可以在Web容器中载入Resource,等等。下面以FileSystemXmlApplicationContext为例,通过分析这个ApplicationContext的实现来看看它是怎样完成这个Resource定位过程的。作为辅助,我们可以在图2-4中看到相应的ApplicationContext继承体系。从图2-4中可以看到,这个FileSystemXmlApplicationContext已经通过继承Abstra-ctApplicationContext具备了ResourceLoader读入以Resource定义的BeanDefiniti-on的能力,因为AbstractApplicationContext的基类是DefaultResourceLoader。下面看看FileSystemXmlApplicationContext的具体实现,如代码清单2-4所示。代码清单2-4 FileSystemXmlApplicationContext的实现1. publicclassFileSystemXmlApplicationContextextends 2. AbstractXmlApplicationContext 3. publicFileSystemXmlApplicationContext() 4. 5. public6. FileSystemXmlApplicationContext(ApplicationContextparent) 7. super(parent); 8. 9. /这个构造函数的configLocation包含的是BeanDefinition 10. 所在的文件路径。 11. publicFileSystemXmlApplicationContext(String 12. configLocation)throwsBeansException 13. this(newStringconfigLocation,true, 14. null); 15. 16. /这个构造函数允许configLocation包含多个BeanDefiniti 17. on的文件路径。 18. publicFileSystemXmlApplicationContext(String 19. configLocations)throwsBeansException 20. this(configLocations,true,null); 21. 22. /* 23. *这个构造函数在允许configLocation包含多个BeanDefinit 24. ion的文件路径的同时, 25. *还允许指定自己的双亲IoC容器。 26. */ 27. publicFileSystemXmlApplicationContext(String 28. configLocations,ApplicationContext 29. parent)throwsBeansException 30. this(configLocations,true,parent); 31. 32. publicFileSystemXmlApplicationContext(String 33. configLocations,booleanrefresh) 34. throwsBeansException 35. this(configLocations,refresh,null); 36. 37. /* 38. *在对象的初始化过程中,调用refresh函数载入BeanDefini 39. tion,这个refresh 40. *启动了BeanDefinition的载入过程,我们会在下面进行详 41. 细分析。 42. */ 43. publicFileSystemXmlApplicationContext(String 44. configLocations,booleanrefresh, 45. ApplicationContextparent) 46. throwsBeansException 47. super(parent); 48. setConfigLocations(configLocations); 49. if(refresh) 50. refresh(); 51. 52. 53. /* 54. *这是应用于文件系统中Resource的实现,通过构造一个Fil 55. eSystemResource来 56. *得到一个在文件系统中定位的BeanDefinition。 57. */ 58. /* 59. *这个getResourceByPath是在BeanDefinitionReader的load60. BeanDefintion中被调用的。 61. *loadBeanDefintion采用了模板模式,具体的定位实现实际 62. 上是由各个子类完成的。 63. */ 64. protectedResourcegetResourceByPath(Stringpath) 65. if(path!=null&path.startsWith(/) 66. path=path.substring(1); 67. 68. returnnewFileSystemResource(path); 69. 70. 在FileSystemApplicationContext中,我们可以看到实现了两个部分的功能,一部分是在构造函数中,对configuration进行处理,使得所有在配置在文件系统中的XML文件方式的BeanDefnition都能够得到有效的处理,比如实现了getResourceByPath方法,这个方法是一个模板方法,是为读取Resource服务的。对于IoC容器功能的实现,这里没有涉及,因为它继承了AbstractXmlApplicationContext,关于IoC容器功能相关的实现,都是在FileSystemXmlApplicationContext中完成的,但是在构造函数中通过refresh来启动了IoC容器的初始化,这个refresh方法非常重要,也是我们以后分析容器初始化过程实现的一个重要入口。注意 FileSystemApplicationContext是一个支持XML定义BeanDefinition的ApplicationContext,并且可以指定以文件形式的BeanDefinition的读入,这些文件可以使用文件路径和URL定义来表示。在测试环境和独立应用环境中,这个ApplicationContext是非常的有用的。根据图2-5的调用关系分析,我们可以清楚地看到整个BeanDefinition资源定位的过程。这个对BeanDefinition资源定位的过程,最初是由refresh来触发的,这个refresh的调用是在FileSystemXmlBeanFactory的构造函数中启动的。大家看了上面的调用过程可能会比较好奇,这个FileSystemXmlApplicationContext在什么地方定义了BeanDefinition的读入器BeanDefinitionReader,从而完成BeanDefi-nition信息的读入呢?在前面分析过,在IoC容器的初始化过程中,BeanDefinition资源的定位、读入和注册过程是分开进行的,这也是解耦的一个体现。关于这个读入器的配置,可以到FileSystemXmlApplicationContext的基类AbstractRefreshableApplicationContext中看看它是怎样实现的。我们重点看看AbstractRefreshableApplicationContext的refreshBeanFactory方法的实现,这个refreshBeanFactory被FileSystemXmlApplicationContext构造函数中的refresh调用。在这个方法里,通过createBeanFactroy构建了一个IoC容器供Appl-icationContext使用。这个IoC容器就是我们前面提到过的DefaultListableBeanFactory,同时,它启动了loadBeanDefinitions来载入BeanDefinition,这个过程和我们前面看到的编程式的使用IoC容器(XmlBeanFactory)的过程非常类似。从代码清单2-4中可以看到,在初始化FileSystmXmlApplicationContext的过程中,通过IoC容器的初始化的refresh来启动整个调用,使用的IoC容器是DefultListableBeanFactory。具体的资源载入在XmlBeanDefinitionReader读入BeanDefinition时完成,在XmlBeanDefinitionReader的基类AbstractBeanDefinitionReader中可以看到这个载入过程的具体实现。对载入过程的启动,可以在AbstractRefreshableApplicationCont-ext的loadBeanDefinitions方法中看到,如代码清单2-5所示。代码清单2-5 AbstractRefreshableApplicationContext对容器的初始化1. protectedfinalvoidrefreshBeanFactory()throwsBeansException 2. /这里判断,如果已经建立了BeanFactory,则销毁并关闭该BeanFactory。 3. if(hasBeanFactory() 4. destroyBeans(); 5. closeBeanFactory(); 6. 7. /这里是创建并设置持有的DefaultListableBeanFactor的地方。 8. /同时调用loadBeanDefinitions再载入BeanDefinitione的信息。 9. try 10. DefaultListableBeanFactorybeanFactory=createBeanFactory(); 11. beanFactory.setSerializationId(getId(); 12. customizeBeanFactory(beanFactory); 13. loadBeanDefinitions(beanFactory); 14. synchronized(this.beanFactoryMonitor) 15. this.beanFactory=beanFactory; 16. 17. 18. catch(IOExceptionex) 19. thrownewApplicationContextException(I/OerrorparsingXMLdocument 20. for+getDisplayName(),ex); 21. 22. 23. /* 24. *这就是在上下文中创建DefaultListabl
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年化工工艺工程师面试题及解析
- 2025年计算机编程技能测试模拟题集PythonJava等含答案解析
- 2025年特岗教师招聘笔试初中地理高频考点归纳与解析
- 2025年银行安保岗位保安业务笔试题目及答案
- 骨质疏松的概念症状临床诊断及护理要点
- 甲状腺彩超课件
- 甲烷和烷烃课件
- 中班小朋友教学课件模板
- 书签超链接的教学课件
- 江苏苏州2020-2022年中考满分作文41篇
- 2025年检验检测机构资质认定(授权签字人)试题(含答案)
- 建筑质量安全知识培训课件
- 八五普法考试试题及答案
- 商业秘密培训课件
- 合同基础知识培训课件
- 2025年通信工程师-初级通信工程师历年参考题库含答案解析(5套典型考题)
- 电梯安全教学课件
- 2025-2026学年【秋】第一学期少先队工作计划:青春筑梦扬队旗励志前行绘未来
- 2025年评茶员职业技能鉴定题库(含答案)
- 数学集体备课汇报展示
- 食品生产企业采购管理制度
评论
0/150
提交评论