在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 Code4.定義一個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 Code6.定義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(); }}測試結果

新聞熱點
疑難解答