博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
spring源码--依赖注入
阅读量:7017 次
发布时间:2019-06-28

本文共 2400 字,大约阅读时间需要 8 分钟。

hot3.png

XmlBeanDefinitionReader xmlBeanDefinitionReader = new XmlBeanDefinitionReader(new ResourceLoader());

        xmlBeanDefinitionReader.loadBeanDefinitions("tinyioc.xml");

1、先加载Resource 对象,获取XmlBeanDefinitionReader 对象。然后调用loadBeanDefinitions方法加载spring配置文件

加载过程:
(1)先将配置文件通过getResourceLoader().getResource(location).getInputStream(); 加载到流中

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

        DocumentBuilder docBuilder = factory.newDocumentBuilder();
        Document doc = docBuilder.parse(inputStream);
(2)然后通过以上方法,将流中的内容 转换成Document对象,Element root = doc.getDocumentElement();
再将doc 转换成Element对象(该对象是xml对应标签的实例)

(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 和class

String name = ele.getAttribute("id");

        String className = ele.getAttribute("class");
        BeanDefinition beanDefinition = new BeanDefinition();
        processProperty(ele, beanDefinition);
        beanDefinition.setBeanClassName(className);
        getRegistry().put(name, beanDefinition);

(4)获取到的bean标签对应的name 和className,并将className 封装进BeanDefinition,并将name 和BeanDefinition

封装到XmlBeanDefinitionReader  的map属性中,用于以后的遍历和使用,

如果该bean对象,如果还有依赖的属性,还是需要将依赖的属性  封装进BeanDefinition的PropertyValues属性中,如果有ref注入

那么还需要获取到ref的value 并封装进BeanReference 并将其封装到beanDefinition 的PropertyValues中

BeanDefinition 对象属性有

private Object bean;

    private Class beanClass;

    private String beanClassName;//存放 class 对应的包名.类名

    private PropertyValues propertyValues = new PropertyValues();//包装一个bean 需要的所有属性和value

以上,就完成了bean 的配置文件的读取和注入的准备工作

2、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 项目

 

转载于:https://my.oschina.net/u/2543341/blog/1528512

你可能感兴趣的文章
Python快速学习04:循环 & 函数
查看>>
Java并发编程系列之四:volatile和锁的内存语义
查看>>
(一一九)类作用域
查看>>
MFC学习笔记之一(绘图+控制)
查看>>
C++语言之动态内存分配
查看>>
PgSQL · 答疑解惑 · PostgreSQL 9.6 并行查询实现分析
查看>>
分布式系统的理解
查看>>
微服务熔断与隔离
查看>>
html中link的用法
查看>>
RSA非对称加密
查看>>
【基础】利用 hexo + Gitpage 开发自己的博客
查看>>
JPA/Hibernate/Spring Data概念
查看>>
Vue Render介绍和一些基本的实例
查看>>
oracle业务硬盘出现故障无法访问,提示需要重新格式化后解决方法
查看>>
阿里云腾讯云服务器部署安装 Mysql5.7.20 【三部曲之一】
查看>>
webpack打包合并
查看>>
[转] 如何实现 React 写小程序-1
查看>>
iOS开发之 Method Swizzling 深入浅出
查看>>
百万开发师讲解:iOS性能优化
查看>>
简单的聊聊索引的那些事儿
查看>>