您的位置:首页 > 编程语言 > Java开发

spring加载时机的一些理解

2016-01-15 16:15 330 查看
对于spring框架 相信大家不会陌生,今天就带大家看看,这个框架里面几个关于加载spring容器的关键点:

   resource: 这个接口代表资源配置文件的。特别说明下,这里的资源文件是用spring容器,管理bean的配置文件.

   beanDefinition:这个接口,代表的是spring容器数据表示形式,也就是说spring容器从哪里获得bean的信息的资源,让后创建它,spring先拿到的是一个beanDefinition类型的对    象,然后得到bean的信息创建它。这里仅仅是把我们用xml配置bean的信息封装成了beanDefinition对象而已。

   BeanDefinitionHolder:这是beanDefinition这个接口的实现,它就是真正代表spring框架的数据结构,例如在bean配置的id,class,init-method等这些属性都在这个类里面。

   resourceLoader:这个接口,专门是用来查找resource资源地址,定位resource文件。

  defaultListableBeanFactory: 这个类是,spring容器默认基本实现,它实现了spring的大部分功能,不管你是applicationcontext, xmlbeanFatory,还是            fileSystemclasspathApplication它都继承了这个类。

  beanFactory:这个接口定义了spring容器的基本规范和行为,所有各种spring容器的实现,都是围绕着这个接口来实现了,无非是在它的基础之上进行封装,封装再封装,拥有各   种各样的功能而已。

  xmlBeanDefinitionReader: 这个是个xml解析器,它专门解析spring容器的xml文件,它会把启动整个spring容器加载xml文件的过程。

 BeanDefinitionParserDelegate:解析document节点的类,它把xml文件当作document文本对象对象进行解析,解析后的值放到BeanDefinitionHolder这个类的对象中。

 BeanDefinitionDocumentReader:这个类用来将BeanDefinitionHolder对象,注册到spring容器中,其实就是放到一个全局map中,但是它会触发加载<bean>标签这个动作。

documentLoader:加载spring容器xm文件,转换成document对象。有了这个document对象我们就可以解析spring节点了。

 

BeanDefinitionDocumentReader:这个类是spring容器xml的document对象的解析器,也就是说这个类,它负责解析spring容器xml的表示documnt对象。

关键点间的联系:

   首先,当spring容器启动的时候,在applicationcontext, xmlbeanFatory,fileSystemclasspathApplication这三个容器的实现,都有一个refresh()的方法,这个方法触发spring容器加载,并且会创建一个defaultListableBeanFactory对象,接着把这个对象当作参数,传给xmlBeanDefinitionReader的loadBeanDefinitions的方法,加载spring配置xml文件,整个加载的过程中,是以defaultListableBeanFactory对象为核心,进行加载配置文件的,由它启动容器的加载,而且这个对象它包含了spring容器的基本功能和内容,当当然了,这个接口也继承了beanFactory这个接口。

       resource这是资源的接口,你构造applicationcontext对象,如 new ClassPathXmlApplicationContext("classpath*:META-INF/spring/*.xml"),它会吧META-INF/spring/*.xml这个目录下面的所有文件都解析出来,当然这些文件,我们当它是file文件对象,然后转换成url对象,最后转成Resource对象,然后再把它包装成encodedResource对象,这个对象有文件的编码格式,默认是从文件读取的格式,一般都设置成utf-8。在然后,调用getInputStream(),获得输入流InputStream对象,最后把InputStream对象包装成InputSource对象,把这个对象交给documentLoader这个类,这个类的loadDocument方法,这个方法,会把InputSource对象转换成xml的document文本对象。

      当然了,创建xml的document对象这个就不用我说了吧,很通用的比如创建DocumentBuilderFactory对象,然后接着DocumentBuilder 对象,再用这个对象,转换inputSource对象。接着创建一个BeanDefinitionDocumentReader解析spring容器xml的对象,这个解析器,专门解析代表spring容器的一些xml规范。接着在调用这个解析器,registerBeanDefinitions方法,这个方法,会做两件事情,第一个是解析docuemnt对象把document对象,吧document对象的节点,解析后放到BeanDefinitionHolder对象中去,让后在注册到spring容器中去,key是bean的名称或id,value是BeanDefinitionHolder对象。

   对于解析docuemnt对象来说,这个解析动作是由BeanDefinitionParserDelegate这个类的对象来解析的,它是具体的解析元素的属性。当然了,解析好的属性值放到BeanDefinitionHolder对象中。当然了当解析和注册功能完成之后,

     spring这个框架最强大的地方就是在它加载的时候的,把所有一些我们程序要用到的组件,都已经准备好或即将准备好了,并且由spring框架维护这些组件的关系,它功能其实就这么简。

   可能我写的条理不是很清楚,还请多多包涵,第一次发表技术文章,希望对你有所帮助。

  

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: