第1关:Dom4j的基本使用
package step1;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class Task {
public static void main(String[] args) {
//该集合用来存储书本信息
List<String> bookList=new ArrayList<>();
/********** Begin **********/
//1.获取Document对象
SAXReader saxReader=new SAXReader();
try {
Document document = saxReader.read(new File("src/step1/books.xml"));
//2.获取根节点
Element rootElement = document.getRootElement();
//3.获取根节点下所有子节点
List<Element> elements = rootElement.elements("book");
//4.遍历子节点并将文档中信息添加到集合
for (Element element : elements) {
bookList.add(element.getText()+"---"+element.attributeValue("author"));
}
//5.遍历输出文档信息
for (int i = 0; i < bookList.size(); i++) {
System.out.println(bookList.get(i));
}
} catch (DocumentException e) {
e.printStackTrace();
}
/********** End **********/
}
}
第2关:使用反射从xml文件中获取对象
beans.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans>
<!-- 配置bean -->
<bean id="person" class="step2.Student"></bean>
</beans>
Task.java
package step2;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class Task {
/**
* 获取Student对象(注意抛出异常)
* @return
*/
public Student getStu(){
Student stu=null;
/*********** Begin ***********/
try {
Document doc=new SAXReader().read("src/step2/beans.xml");
Element elm = doc.getRootElement().element("bean");
//获取beans.xml文档中class属性中的内容 也就是类的全类名
String className = elm.attributeValue("class");
Class clazz = Class.forName(className);
stu = (Student) clazz.newInstance();
} catch (Exception e) {
e.printStackTrace();
}
/*********** End ***********/
return stu;
}
}
第3关:模拟Spring获取对象过程
beans.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans>
<!-- 配置bean -->
<bean id="person" class="step3.Person"></bean>
<bean id="animal" class="step3.Animal"></bean>
</beans>
ApplicationContext.java
package step3;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class ApplicationContext {
//实例化容器时传解析文件名file
public ApplicationContext(String file) {
init(file);
}
//创建Map集合
private Map<String,Object> beanMap=new HashMap<String,Object>();
//解析文件
private void init(String file) {
/********** Begin **********/
//1.创建解析器SAXReader 对象
SAXReader saxReader=new SAXReader();
Document doc=null;
//2.读取数据
try {
doc=saxReader.read(file);
} catch (DocumentException e) {
e.printStackTrace();
}
//3.拿到根源元素
Element rootElement = doc.getRootElement();
//4.获取根源所有的bean元素(标签)
List<Element> list = rootElement.elements("bean");
for (Element element : list) {
String idName = element.attributeValue("id");
String className = element.attributeValue("class");
Object obj=null;
//5.使用反射创建对象
try{
obj=Class.forName(className).newInstance();
} catch (Exception e) {
e.printStackTrace();
}
//6.存储对象
beanMap.put(idName,obj);
}
/********** End **********/
}
public Object getBean(String id){
Object obj=null;
/********** Begin **********/
//7.根据参数id到Map中查出对应的对象实例返回
obj=beanMap.get(id);
/********** End **********/
return obj;
}
}
Task.java
package step3;
import java.util.List;
import java.util.ArrayList;
public class Task{
public static List<Object> getBeans() {
List<Object> list=new ArrayList<>();
/********** Begin **********/
//1.实例化ApplicationContext容器 传入要解析的xml文档路径
ApplicationContext applicationContext=new ApplicationContext("src/step3/beans.xml");
//2.通过getBean()获取对象
Object obj1 = applicationContext.getBean("person");
Object obj2 = applicationContext.getBean("animal");
list.add(obj1);
list.add(obj2);
/********** End **********/
return list;
}
}