万事开头难,上篇已经起了一个头,之后的事情相对就简单了。上次定义了框架所需的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如下
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如下
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:
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),转载请注明。
没有评论:
发表评论