在J2EE项目中可能会涉及到一些框架的使用,最近接触到了SSH,拿Spring来说配置文件的使用是相当重要的,Spring的配置文件是一个xml文件,Spring是如何读取到配置文件并进行依赖注入的呢?今天先来说说xml文件的解析。

解析xml文件可以使用jdom,下面我以一个小栗子来说说xml文件的解析。

1.首先下载jdom,在这里我以jdom2.0.6为例

2.接下来附上一个xml文档

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans>
  3. <bean id="u" class="edu.nupt.bbs.UserDAOImp" />
  4. <bean id ="service" class="edu.nupt.bbs.UserService">
  5. <property name="userdao" ref="u" />
  6. </beans>
  7. </beans>

代码模仿的是Spring的配置文件

3.定义一个User类(model)代码如下

  1. package edu.nupt.bbs;
  2.  
  3. public class User {
  4. private String id;
  5. public String getId() {
  6. return id;
  7. }
  8. public void setId(String id) {
  9. this.id = id;
  10. }
  11. public String getName() {
  12. return name;
  13. }
  14. public void setName(String name) {
  15. this.name = name;
  16. }
  17. private String name;
  18. }

4.定义一个UserDAO接口这是一个DAO接口为了方便实验主要提供了addUser和deleteUser接口

  1. package edu.nupt.bbs;
  2.  
  3. public interface UserDAO {
  4. public void add();
  5. public void delete();
  6. }

5.定义一个UserDAOImp实现了UserDAO接口一开始我不太明白为什么要将UserDAO写成接口的形式可能是为了在不同的数据库上面做到兼容,具体的代码如下,为了简单直观在add方法和delete方法中直接在控制台打印出一段文字

  1. package edu.nupt.bbs;
  2. /**
  3. * 一种UserDAO的实现(在实际的应用中可能是一种数据库对应一种UserDAO实现)
  4. * @author xiaoysec
  5. *
  6. */
  7. public class UserDAOImp implements UserDAO {
  8.  
  9. @Override
  10. public void add() {
  11. // TODO Auto-generated method stub
  12. System.out.println("user add");
  13. }
  14.  
  15. @Override
  16. public void delete() {
  17. // TODO Auto-generated method stub
  18. System.out.println("user delete");
  19. }
  20.  
  21. }

6.定义UserService类实现User对象的增删,一开始接触J2EE的时候不是很清楚为什么要写这么多看似不需要的类,但是渐渐地会发现这种分层的思想是极为合理的,方便了程序的拓展和维护。

  1. package edu.nupt.bbs;
  2. /**
  3. * 一种UserDAO的实现(在实际的应用中可能是一种数据库对应一种UserDAO实现)
  4. * @author xiaoysec
  5. *
  6. */
  7. public class UserDAOImp implements UserDAO {
  8.  
  9. @Override
  10. public void add() {
  11. // TODO Auto-generated method stub
  12. System.out.println("user add");
  13. }
  14.  
  15. @Override
  16. public void delete() {
  17. // TODO Auto-generated method stub
  18. System.out.println("user delete");
  19. }
  20.  
  21. }

基本的工作已经结束了,下面就是进行Spring配置文件读取的模拟了,我模仿了Spring中的命名方式定义了:BeanFactory和ClassPathXmlApplicationContext

7.BeanFactory接口 返回的是一个Object对象我们通过xml的id属性作为参数从BeanFactory中取出一个Bean对象。这个接口就像他的名字一样可以把她想象成一个工厂通过id参数为外界提供bean对象。

  1. package edu.nupt.bbs.Spring;
  2. //根据id返回一个bean
  3. public interface BeanFactory {
  4. public Object getBean(String id);
  5.  
  6. }

8.ClassPathXmlApplicationContext

  1. package edu.nupt.bbs.Spring;
  2.  
  3. import java.io.IOException;
  4. import java.util.HashMap;
  5. import java.util.List;
  6. import java.util.Map;
  7.  
  8. import org.jdom2.Document;
  9. import org.jdom2.Element;
  10. import org.jdom2.JDOMException;
  11. import org.jdom2.input.SAXBuilder;
  12. import org.junit.Test;
  13.  
  14. import edu.nupt.bbs.test.JdomTest;
  15.  
  16. public class ClassPathXmlApplicationContext implements BeanFactory {
  17. // 用于存放bean实例对象
  18. private Map<String, Object> map = new HashMap<String, Object>();
  19.  
  20. // 用于取出bean实例对象
  21. @Override
  22. public Object getBean(String id) {
  23. // TODO Auto-generated method stub
  24. Object o = map.get(id);
  25. return o;
  26. }
  27.  
  28. public ClassPathXmlApplicationContext() {
  29. try {
  30. SAXBuilder sb = new SAXBuilder();
  31. Document doc = sb.build(JdomTest.class.getClassLoader()
  32. .getResourceAsStream("jdom.xml")); // 构造文档对象
  33. Element root = doc.getRootElement(); // 获取根元素 beans
  34. List list = root.getChildren("bean");// 取名字为bean的所有元素
  35. for (int i = 0; i < list.size(); i++) {
  36. Element element = (Element) list.get(i);
  37. String id = element.getAttributeValue("id"); // 获取id的值
  38. String clazz = element.getAttributeValue("class");// 获取class的值
  39. // System.out.println(id + ":" + clazz);
  40. try {
  41. Object o = Class.forName(clazz).newInstance();
  42. map.put(id, o);// 将id代表的对象放入map
  43.  
  44. } catch (InstantiationException e) {
  45. // TODO Auto-generated catch block
  46. e.printStackTrace();
  47. } catch (IllegalAccessException e) {
  48. // TODO Auto-generated catch block
  49. e.printStackTrace();
  50. } catch (ClassNotFoundException e) {
  51. // TODO Auto-generated catch block
  52. e.printStackTrace();
  53. }
  54. }
  55. } catch (JDOMException e) {
  56. // TODO Auto-generated catch block
  57. e.printStackTrace();
  58. } catch (IOException e) {
  59. // TODO Auto-generated catch block
  60. e.printStackTrace();
  61. }
  62.  
  63. }
  64.  
  65. }

需要提供一个Map对象作为容器存放生成的bean对象,其实上面的代码就是完成了xml解析以及bean实例对象的生成,并把bean实例对象放在map中,其中用到了Java反射。

<bean id="u" class="edu.nupt.bbs.UserDAOImp" />这是上面代码中存放在List的一个对象,其实就是用反射根据class的值生成实例的对象赋值给u即 UserDAOImp u = new UserDAOImp();

9.测试类

  1. package edu.nupt.bbs.test;
  2.  
  3. import static org.junit.Assert.*;
  4.  
  5. import org.junit.Test;
  6.  
  7. import edu.nupt.bbs.User;
  8. import edu.nupt.bbs.UserDAO;
  9. import edu.nupt.bbs.UserService;
  10. import edu.nupt.bbs.Spring.BeanFactory;
  11. import edu.nupt.bbs.Spring.ClassPathXmlApplicationContext;
  12.  
  13. public class UserServiceTest {
  14.  
  15. @Test
  16. public void addUsertest() {
  17. BeanFactory bf = new ClassPathXmlApplicationContext();
  18. UserDAO userdao = (UserDAO)bf.getBean("u");
  19. UserService service = (UserService)bf.getBean("service");
  20. service.setUserdao(userdao);
  21. service.addUser();
  22. }
  23.  
  24. }

测试结果

  1.  

使用JDom解析XML文档模拟Spring的配置文件解析的更多相关文章

  1. 解析XML文档之三:使用DOM解析

    dom解析方法是将整个xml文档装载到内存当中,然后通过树形结构方式去解析的,这种方式只适合于在pc端的开发,不是很适合手机端的开发,毕竟来说手机的内存是没法跟pc相提并论的. 具体实现步骤如下: 第 ...

  2. 解析XML文档之一:使用SAX解析

    使用sax解析xml方法总结 解析的的xml文档格式如下 <?xml version="1.0" encoding = "UTF-8"?> < ...

  3. Java高级特性 第15节 解析XML文档(3) - JDOM和DOM4J技术

    一.JDOM解析 特征: 1.仅使用具体类,而不使用接口. 2.API大量使用了Collections类. Jdom由6个包构成: Element类表示XML文档的元素 org.jdom: 解析xml ...

  4. 使用JDOM解析xml文档

    一.使用JDOOM解析xml文档 准备工作 1.下载JDOM.jar 包 解析代码如下 import org.jdom2.Attribute; import org.jdom2.Document; i ...

  5. 四种生成和解析XML文档的方法详解(介绍+优缺点比较+示例)

    众所周知,现在解析XML的方法越来越多,但主流的方法也就四种,即:DOM.SAX.JDOM和DOM4J 下面首先给出这四种方法的jar包下载地址 DOM:在现在的Java JDK里都自带了,在xml- ...

  6. 浅谈用java解析xml文档(四)

    继续接上一文,这一阵子因为公司项目加紧,导致最后一个解析xml文档的方式,还没有总结,下面总结使用dom4J解析xml. DOM4J(Document Object Model for Java) 使 ...

  7. 浅谈用java解析xml文档(三)

    接上一篇,本文介绍使用JDOM解析xml文档, 首先我们还是应该知道JDOM从何而来,是Breet Mclaughlin和Jason Hunter两大Java高手的创作成果,2000年初, JDOM作 ...

  8. DOM4J解析XML文档

    Tip:DOM4J解析XML文档 Dom4j是一个简单.灵活的开放源代码的库.Dom4j是由早期开发JDOM的人分离出来而后独立开发的.与JDOM不同的是,dom4j使用接口和抽象基类,虽然Dom4j ...

  9. dom4j解析xml文档全面介绍

    一.dom4j介绍 dom4j是一个Java的XML API,类似于jdom,用来读写XML文件的.dom4j是一个非常非常优秀的Java XML API,具有性能优异.功能强大和极端易用使用的特点, ...

随机推荐

  1. SharePoint 2013 强制安装解决方案

    Add-SPSolution Install-SPSolution -Identity DemonstrationZone.wsp -GACDeployment -CompatibilityLevel ...

  2. javascrip格式

    1:若Button_Search_onclick()方法不存则在页面在火狐浏览器是可以正常运行,但是在IE浏览器就会出现问题 建议删除没用到的方法

  3. Linux解决xhost: unable to open display

    实用技巧:在Linux下设置xhost方法步骤 第一步:用root登陆linux,启动vnc服务: 第二步:根据vnc起来的端口,设置export DISPLAY=localhost:1(1表示vnc ...

  4. C++_转换转子(4种)

    static_cast const_cast dynamic_cast

  5. EC读书笔记系列之17:条款41、42、43、44、45、46

    条款41 了解隐式接口与编译器多态 记住: ★classes和templates都支持接口和多态 ★对classes而言接口是显式的(explicit),以函数签名为中心.多态则是通过virtual函 ...

  6. 新学习的Python的代码(while循环)

    直接上代码: # while.py number = 23 isRun = True while isRun: intt = int(raw_input('请输入一个整数 : ')) if intt ...

  7. jquery学习(2)--选择器

    jquery-李炎恢学习视频学习笔记.自己手写. 简单的选择器    css 写 法: #box{ color:#f00;}    //id选择器    jquery获取:$('#box').css( ...

  8. c语言中的制表符\t与空格

    (本文不讨论制表符与空格缩进问题) 编程过程中,我们常常用多个空格或制表符分隔两个字符串,那么这两个在显示效果上有什么区别呢? 比较如下两行代码的输出效果 代码1: printf("1\t1 ...

  9. Windows 7 with SP1简体中文旗舰版(微软MSDN原版)+ 激活密钥

    在Windows 7六个版本中,旗舰版和企业版功能性能完全一样,同属诸版本之中的最高版本.现提供Windows 7 with SP1简体中文旗舰版(微软MSDN最新原版)+ 激活密钥如下: 32位版本 ...

  10. Microsoft Office 2010 Pro VOL简体中文正式版

    网友们期待的Microsoft Office Professional Plus 2010 VOL简体中文正式版.所谓的“VOL”,即是Volume Licensing for Organizatio ...