引言
在设计模式中或者其他代码编写过程中,通常会用到面向抽象编程。即客户端只需要知道接口或者抽象类的名称即可,不需要关心具体的实现类的名称,而是通过在配置文件中配置相关的实现类来完成。同时修改配置文件即完成实现类的更换,从而使得程序对客户端也符合开闭原则。
好吧以上都是废话,主要就是说明啥时候需要使用Dom4j,就是说需要从配置文件中获取具体实现类时
准备工作
①需要使用dom4j.jar包,网上下载或者https://download.youkuaiyun.com/download/m1179457922/12634436,然后导入到工程中即可
②配置文件config.xml ,具体位置无所谓,但是必须程序能访问到。例如
<?xml version="1.0" encoding="UTF-8"?>
<config>
<classPath>Dom4j.TestBean2</classPath>
</config>
为了完成XML的功能还需要
③一个接口:例如
public interface TestInterface {
public void sayHello();
}
④两个具体实现类,例如
public class TestBean2 implements TestInterface{
@Override
public void sayHello() {
// TODO Auto-generated method stub
System.out.println("hello Java");
}
}
public class TestBean implements TestInterface{
@Override
public void sayHello() {
System.out.println("hello world");
}
}
⑤一个实现XML功能的类XMLUtil和一个客户端测试类
Dom4j的使用
说了这么多,进入正题。Dom4j的使用就是四步(是不是特别简便,O(∩_∩)O)
①创建SAXReader对象。(该对象是Dom4j本身自带的,使用无参构造器直接new即可)
②使用SAXReader对象的read()来获得Document对象(Document对象会有很多种,主要要使用dom4j包下的那个)(read方法的参数就是要读取的XML文件的路径,绝对相对都可以)
③就是使用Document对象的getRootElement()来获得Element对象,例子中获得是<config></config>
④利用Element对象的各种方法来完成相关的操作
1、elements():获得该Element下的所有子标签,返回值是是一个List集合,当然也可以传入字符串来获得对应的标签,返回值就是一个Element对象。通过递归遍历可以获得整个XML标签树
2、attributeValue(""):传入一个字符串,来获得标签中的对应属性的值,返回值是String(例如id、value、style、class等等)
3、elementText(""):传入一个字符串,获得对应子标签的标签体(注意是子标签的标签体,如果要获得本标签的标签体,使用getText())
等等等等,API很多,但是这几个比较常用。至此,我们得到了具体实现类的路径。下面通过反射来获取。较为简单,不赘述。
代码实现
XMLUtil代码:
public class XMLUtils {
public static Object getBean() {
Object resutlt = null;
try {
//创建SAXReader对象
SAXReader reader = new SAXReader();
//获取XML文件对应的Document对象
Document document = reader.read("src\\Dom4j\\config.xml");
//获得根标签
Element rootElement = document.getRootElement();
//获得子标签的文本值(类名)
String elementText = rootElement.elementText("classPath");
System.out.println(rootElement.getText());
//反射获得类
Class c = Class.forName(elementText);
resutlt = c.newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return resutlt;
}
}
客户端
public class MainTest {
public static void main(String[] args) {
TestInterface interface1 = (TestInterface) XMLUtils.getBean();
interface1.sayHello();
}
}
结果
当配置文件为TestBean时,输出为hello world
当配置文件为TestBean2时,输出为hello Java
总结
本文是对Dom4j如何使用XML文件进行配置,从而保证对客户端的开闭原则。