XmlBeanDefinitionReader xmlBeanDefinitionReader = new XmlBeanDefinitionReader(new ResourceLoader());
xmlBeanDefinitionReader.loadBeanDefinitions("tinyioc.xml");node
一、先加载Resource 对象,获取XmlBeanDefinitionReader 对象。而后调用loadBeanDefinitions方法加载spring配置文件
加载过程:
(1)先将配置文件经过getResourceLoader().getResource(location).getInputStream(); 加载到流中git
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = factory.newDocumentBuilder();
Document doc = docBuilder.parse(inputStream);
(2)而后经过以上方法,将流中的内容 转换成Document对象,Element root = doc.getDocumentElement();
再将doc 转换成Element对象(该对象是xml对应标签的实例)spring
(3)NodeList nl = root.getChildNodes();
for (int i = 0; i < nl.getLength(); i++) {
Node node = nl.item(i);
if (node instanceof Element) {
Element ele = (Element) node;
processBeanDefinition(ele);
}
}
将Element对象转换成NodeList对象,遍历bean标签。获取指定bean标签中的id 和classui
String name = ele.getAttribute("id");
String className = ele.getAttribute("class");
BeanDefinition beanDefinition = new BeanDefinition();
processProperty(ele, beanDefinition);
beanDefinition.setBeanClassName(className);
getRegistry().put(name, beanDefinition);xml
(4)获取到的bean标签对应的name 和className,并将className 封装进BeanDefinition,并将name 和BeanDefinition
封装到XmlBeanDefinitionReader 的map属性中,用于之后的遍历和使用,对象
若是该bean对象,若是还有依赖的属性,仍是须要将依赖的属性 封装进BeanDefinition的PropertyValues属性中,若是有ref注入
那么还须要获取到ref的value 并封装进BeanReference 并将其封装到beanDefinition 的PropertyValues中get
BeanDefinition 对象属性有
private Object bean;input
private Class beanClass;源码
private String beanClassName;//存放 class 对应的包名.类名it
private PropertyValues propertyValues = new PropertyValues();//包装一个bean 须要的全部属性和value
以上,就完成了bean 的配置文件的读取和注入的准备工做
二、xmlBeanDefinitionReader 对map属性进行遍历 ,初始化BeanFactory并注册bean
AbstractBeanFactory beanFactory = new AutowireCapableBeanFactory();
AbstractBeanFactory 是可自动装配内容的BeanFactory
AbstractBeanFactory beanFactory = new AutowireCapableBeanFactory();
for (Map.Entry<String, BeanDefinition> beanDefinitionEntry : xmlBeanDefinitionReader.getRegistry().entrySet()) {
beanFactory.registerBeanDefinition(beanDefinitionEntry.getKey(), beanDefinitionEntry.getValue());
}
registerBeanDefinition 方法中 将 bean 的name 和对应的BeanDefinition 对象封装到AbstractBeanFactory的map中
并检查对应的bean 是否 存在,若是不存在,就create一个bean,并将这个新建立的bean存放到BeanDefinition 属性bean
中,下次调用的时候,直接获取,再getBean 时,直接根据name return返回指定名称的bean,而后强转到指定类型便可。
以上源码,来自git-Hub上的tiny-spring 项目