2014年11月23日星期日

自己动手编写IOC框架(二) - 最后Q泪滴

本邮件内容由第三方提供,如果您不想继续收到该邮件,可 点此退订
自己动手编写IOC框架(二) - 最后Q泪滴  阅读原文»

  万事开头难,上篇已经起了一个头,之后的事情相对就简单了。上次定义了框架所需的dtd也就是规定了xml中该怎么写,有哪些元素。并且我们也让dtd和xml绑定在了一起,使dtd对xml的格式进行校验,并且在DocumentHolder中提供了根据xml文件路径获取xml文件的Document对象。这次我们应该把重点转到从document对象中拿到我们所需要的标签Element元素了。

  一步步来,我们有了document对象,我们接下来开始从document对象下手,顺便说下本框架项目采用分层思想,一层层的进行处理,对于对ioc不感冒的小伙伴们也可以参考下这种思想。我们在xml包下建立element.loader包,由于在这一阶段我们还不知道我们到底需要xml中的哪些元素所以我们准备在这一层提供一个通用的loader层,专门将xml文件中的所有标签统一加载到内存并按照良好的格式保存,并且根据提供获取所有元素集合的方法方便下一层使用,根据我们定义的dtd文件我们知道,xml文件中就两种元素beans和bean元素,我们重点就考虑bean元素,而且每个bean元素必有id元素,我们还应该提供根据id获取bean元素的方法。那么下面我们到底应该怎么去依据document参数提供这两个方法呢,难道每次我们就从document开始往下遍历吗,所以我给出的方法就是再加一个加载所有元素的方法,依据document将所有element对象加载到内存中使用键值对的方式将id和Element对象保存起来。定义接口ElementLoader如下

package com.tear.ioc.bean.xml.element.loader;

import java.util.Collection;

import org.dom4j.Document;
import org.dom4j.Element;

/**
* 载入一个Document对象的所有Element提供保存
*
@author rongdi
*/
public interface ElementLoader {
/**
* 加入一个Document对象的所有Element
*
*
@param document
*/
public void addBeanElements(Document document);

/**
* 根据元素的id获得Element对象
*
*
@param id
*
@return
*/
public Element getBeanElement(String id);

/**
* 返回全部的Element
*
*
@return
*/
public Collection<Element> getBeanElements();
}

从上面的方法名我们可以看出我们没有管根元素beans,如果需要处理beans,小伙伴们可以自己提供类似的方法,这里我们忽略了。

实现类ElementLoaderImpl如下

package com.tear.ioc.bean.xml.element.loader;

import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.dom4j.Document;
import org.dom4j.Element;

public class ElementLoaderImpl implements ElementLoader {
/**
* 定义一个Map来保存一个Document对象中根节点(beans)下所有Element对象
* Map的key对应bean元素的id属性,而Map的value对应bean元素
*/
Map
<String,Element> beanElements = new HashMap<String,Element>();
/**
* 将一个Document对象的所有Element加入到保存Element对象的Map中
*
@param document
*/
@Override
public void addBeanElements(Document document) {
/**
* 先得到根节点beans再得到bean节点
*/
@SuppressWarnings(
"unchecked")
List
<Element> elementList = document.getRootElement().elements();
/**
* 循环将所有的元素的id属性和元素一一对应的加入到Map中
*/
for(Element e:elementList) {
/**
* 得到元素的id属性
*/
String id
= e.attributeValue("id");
/**
* 将id属性和该元素一起添加到Map中
*/
this.beanElements.put(id, e);
}
}

@Override
public Element getBeanElement(String id) {
/**
* 根据id从保存所有元素的Map中取出对应的元素
*/
return beanElements.get(id);
}

@Override
public Collection<Element> getBeanElements() {
/**
* 得到保存所有元素的Map中的所有value的集合,也就是所有的元素的集合
*/
return beanElements.values();
}

}

到了这一层我们已经可以根据document对象得到所有的标签Element对象的集合,也可以根据id获取单个Element,那么我们下一层,就可以根据Element对象去解析bean元素的属性或者bean元素的子元素了。新建element.parser包,在parser定义接口BeanElementParser:

package com.rongdi.ioc.xml.element.parser;

import java.util.List;
import org.dom4j.Element;

import com.rongdi.ioc.xml.autowire.Autowire;
import com.rongdi.ioc.xml.element.LeafElement;
import com.rongdi.ioc.xml.element.PropertyElement;

/**
* 这是解析装载的element的接口,提供一系列的方法
*
@author rongdi
*
*/
public interface BeanElementParser {
/**
* 判断一个bean元素是否需要延迟加载
*
@param element
*
@return
*/
public boolean isLazy(Element beanElement);

上周热点回顾(11.17-11.23) - 博客园团队  阅读原文»

热点随笔:

· 全栈开发必备的10款 Sublime Text 插件梦想天空(山边小溪)
· 我们公司的ASP.NET 笔试题,你觉得难度如何Leo C.W
· Visual Studio 2015 开发 ASP.NET 5 有何变化?田园里的蟋蟀
· 我是如何走上程序员这条道路的bjtqti
· Redis到底该如何利用?笋干
· 小互联网公司manbuzhiwu
· VS2015 C#6.0 中的那些新特性aehyok
· 我们前端是怎么找到工作的豪情
· 压测噩梦后的小感想cheryl_wu
· 用C#开发的双色球走势图(原创)值得园友拥有罗宇皓
· .NET支持多平台后的一点拙见xiaozhi_5638
· 网络采集软件核心技术剖析系列(1)---如何使用C#语言获取博客园某个博主的全部随笔链接及标题际为软件事务所

热点新闻:

· .NET开源引炸锅,纳德拉的计,微软的谋
· 丢了1万元货物的快递小哥 收到阿里巴巴的神秘包裹
· 一个台湾人看内地大学,把问题看到骨髓里了!
· 为什么.NET一开源一跨平台,一些人就在喊Java去死?
· 跑步时,身体在前30分钟的神奇体验
· .NET核心开源
· 九个大佬一台戏:乌镇大佬拌嘴 马云战斗力最强
· 中国24岁美女夺《星际2》世界冠军 获体育总局表彰
· 程序员成长道路上必经的几个阶段
· 90后打工诗人坠楼身亡,富士康无力阻止悲剧再发生
· 程序员的10大成功面试技巧
· 惊艳的Android 5.0与中国无关

知识库热点文章:

· 逃不掉的双十一 可怕的分布式架构隐患


本文链接:上周热点回顾(11.17-11.23),转载请注明。

阅读更多内容

没有评论:

发表评论