Spring中bean的创建
针对Spring中bean的创建在很多面试中出现。下面我来总结一下,大家都能看的懂的,大白话写好;
其实简单来说,Spring中bean的创建可以总结为:就是对象通过xml定义好,然后通过java的反射机制new出对象,最后放在一个map里,想用就就从map里get出来。
下面从内层到外层的顺序来说一下;
1. 加载XML文件,封装成Resource对象
2. 调用Reader对象方法读取XML文件内容,并将相关属性放到BeanDefinition实例
3. 将BeanDefinition对象放到BeanFactory对象
下面我就通过一个例子来给大家说一下:
一共三个工具:一个application.xml,一个bean,一个测试工具类
分别是:
application.xml
|
bean:
|
一个测试类:
|
c从上面测试类打印的结果为“我的名字是:高”。
(一)获取配置文件:ClassPathResource res = new ClassPathResource("applicationContext.xml")
Spring中有很多Resource这里简要处理说明,这里获取了配置文件;
(二)解析配置文件并注册成bean:
这里其实内部处理非常复杂,真正的过程是:将配置文件application.xml中的bean信息解析到BeanDefinition中,然后通过beanFactory的实现类注册到工厂的map中,这样就形成了我们的bean的工厂了;获取时getBean(类名)就行了;
内部处理详细过程为(网上总结的):
a. 构造XmlBeanFactory时,会调用Reader对象的loadBeanDefinitions方法去加载bean定义信息
b. 在Reader对象的doLoadBeanDefinitions验证文档(配置文件)模式,然后通过documentLoader对象处理资源对象,生成我们Document对象;
c. 调用BeanDefinitionDocumentReader对象的doRegisterBeanDefinitions去注册bean定义信息;
d. parseBeanDefinitions从xml文档根节点递归循环处理各个节点,对bean节点真正的处理工作委托给了BeanDefinitionParserDelegate,方法parseBeanDefinitionElement将一个bean节点转换成一个BeanDefinitionHolder对象,这才是最终的解析过程;
e. DefaultListableBeanFactory.registerBeanDefinition利用解析好的beanDefinition对象完成最终的注册,其实就是把beanName和beanDefinition作为键值对放到beanFactory对象的map;
(三)最后就是直接通过getBean()直接实例化bean了;

浙公网安备 33010602011771号