国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

使用JDom解析XML文檔模擬Spring的配置文件解析

2019-11-14 23:14:29
字體:
來源:轉載
供稿:網友
使用JDom解析xml文檔模擬SPRing的配置文件解析

在J2EE項目中可能會涉及到一些框架的使用,最近接觸到了SSH,拿Spring來說配置文件的使用是相當重要的,Spring的配置文件是一個xml文件,Spring是如何讀取到配置文件并進行依賴注入的呢?今天先來說說xml文件的解析。

解析xml文件可以使用jdom,下面我以一個小栗子來說說xml文件的解析。

1.首先下載jdom,在這里我以jdom2.0.6為例

2.接下來附上一個xml文檔

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

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

3.定義一個User類(model)代碼如下

package edu.nupt.bbs;public class User {    private String id;    public String getId() {        return id;    }    public void setId(String id) {        this.id = id;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    private String name;}
View Code

4.定義一個UserDAO接口這是一個DAO接口為了方便實驗主要提供了addUser和deleteUser接口

package edu.nupt.bbs;public interface UserDAO {    public void add();    public void delete();}

5.定義一個UserDAOImp實現了UserDAO接口一開始我不太明白為什么要將UserDAO寫成接口的形式可能是為了在不同的數據庫上面做到兼容,具體的代碼如下,為了簡單直觀在add方法和delete方法中直接在控制臺打印出一段文字

package edu.nupt.bbs;/** * 一種UserDAO的實現(在實際的應用中可能是一種數據庫對應一種UserDAO實現) * @author xiaoysec * */public class UserDAOImp implements UserDAO {        @Override    public void add() {        // TODO Auto-generated method stub     System.out.println("user add");    }    @Override    public void delete() {        // TODO Auto-generated method stub      System.out.println("user delete");    }}
View Code

6.定義UserService類實現User對象的增刪,一開始接觸J2EE的時候不是很清楚為什么要寫這么多看似不需要的類,但是漸漸地會發現這種分層的思想是極為合理的,方便了程序的拓展和維護。

package edu.nupt.bbs;/** * 一種UserDAO的實現(在實際的應用中可能是一種數據庫對應一種UserDAO實現) * @author xiaoysec * */public class UserDAOImp implements UserDAO {        @Override    public void add() {        // TODO Auto-generated method stub     System.out.println("user add");    }    @Override    public void delete() {        // TODO Auto-generated method stub      System.out.println("user delete");    }}
View Code

基本的工作已經結束了,下面就是進行Spring配置文件讀取的模擬了,我模仿了Spring中的命名方式定義了:BeanFactory和ClassPathXmlapplicationContext

7.BeanFactory接口 返回的是一個Object對象我們通過xml的id屬性作為參數從BeanFactory中取出一個Bean對象。這個接口就像他的名字一樣可以把她想象成一個工廠通過id參數為外界提供bean對象。

package edu.nupt.bbs.Spring;//根據id返回一個beanpublic interface BeanFactory {    public Object getBean(String id);}

8.ClassPathXmlApplicationContext

package edu.nupt.bbs.Spring;import java.io.IOException;import java.util.HashMap;import java.util.List;import java.util.Map;import org.jdom2.Document;import org.jdom2.Element;import org.jdom2.JDOMException;import org.jdom2.input.SAXBuilder;import org.junit.Test;import edu.nupt.bbs.test.JdomTest;public class ClassPathXmlApplicationContext implements BeanFactory {    // 用于存放bean實例對象    private Map<String, Object> map = new HashMap<String, Object>();    // 用于取出bean實例對象    @Override    public Object getBean(String id) {        // TODO Auto-generated method stub        Object o = map.get(id);        return o;    }    public ClassPathXmlApplicationContext() {        try {            SAXBuilder sb = new SAXBuilder();            Document doc = sb.build(JdomTest.class.getClassLoader()                    .getResourceAsStream("jdom.xml")); // 構造文檔對象            Element root = doc.getRootElement(); // 獲取根元素 beans            List list = root.getChildren("bean");// 取名字為bean的所有元素            for (int i = 0; i < list.size(); i++) {                Element element = (Element) list.get(i);                String id = element.getAttributeValue("id"); // 獲取id的值                String clazz = element.getAttributeValue("class");// 獲取class的值                // System.out.println(id + ":" + clazz);                try {                    Object o = Class.forName(clazz).newInstance();                    map.put(id, o);// 將id代表的對象放入map                } catch (InstantiationException e) {                    // TODO Auto-generated catch block                    e.printStackTrace();                } catch (IllegalaccessException e) {                    // TODO Auto-generated catch block                    e.printStackTrace();                } catch (ClassNotFoundException e) {                    // TODO Auto-generated catch block                    e.printStackTrace();                }            }        } catch (JDOMException e) {            // TODO Auto-generated catch block            e.printStackTrace();        } catch (IOException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }    }}
View Code

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

<bean id="u" class="edu.nupt.bbs.UserDAOImp" />這是上面代碼中存放在List的一個對象,其實就是用反射根據class的值生成實例的對象賦值給u即 UserDAOImp u = new UserDAOImp();

9.測試類

package edu.nupt.bbs.test;import static org.junit.Assert.*;import org.junit.Test;import edu.nupt.bbs.User;import edu.nupt.bbs.UserDAO;import edu.nupt.bbs.UserService;import edu.nupt.bbs.Spring.BeanFactory;import edu.nupt.bbs.Spring.ClassPathXmlApplicationContext;public class UserServiceTest {    @Test    public void addUsertest() {        BeanFactory bf = new ClassPathXmlApplicationContext();        UserDAO userdao = (UserDAO)bf.getBean("u");        UserService service = (UserService)bf.getBean("service");        service.setUserdao(userdao);        service.addUser();    }}

測試結果


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 东至县| 乐清市| 清丰县| 昌吉市| 文昌市| 甘孜县| 新源县| 济源市| 定边县| 泸溪县| 襄樊市| 高雄县| 鄯善县| 钟祥市| 旅游| 泸西县| 龙门县| 霸州市| 龙川县| 西昌市| 宁强县| 怀远县| 锦屏县| 历史| 乡宁县| 浦东新区| 南乐县| 天台县| 曲阳县| 藁城市| 汉阴县| 长汀县| 连州市| 昌吉市| 昆山市| 广德县| 武清区| 怀柔区| 科尔| 鲁山县| 仪征市|