目录
任务描述
本关任务:利用Dom4j解析xml
文档和反射机制实现Spring
获取对象原理。
相关知识
为了完成本关任务,你需要掌握:Spring
是如何获取并使用配置文件中的对象?
实现过程我们可以分三步来实现:
-
模仿
Spring
的配置文件, -
模仿
Spring
的ApplicationContext
容器, -
通过容器获取并使用对象。
仿 Spring 配置文件
为了更加接近Spring
的实现效果,我们将xml
文档以Spring
的配置文件形式进行模仿。
beans.xml
如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans>
<!-- id用来区分配置对象 class则用来配置类的全路径 -->
<bean id="myObj" class="com.educoder.entity.MyObj"></bean>
</beans>
仿 Spring 的ApplicationContext
容器
我们可以通过上两个章节所学的Dom4j和反射来自定义一个ApplicationContext
容器,用来获取对象,具体思路如下:
1.解析xml
文件
try {
Document doc=new SAXReader().read("beans.xml");
Element elm = doc.getRootElement().element("bean");
String idName = elm.attributeValue("id");
String className = elm.attributeValue("class");
} catch (DocumentException e) {
e.printStackT\frace();
}
2.创建对象
try{
Object obj=Class.forName(className).newInstance();
} catch (Exception e) {
e.printStackT\frace();
}
3.存储对象
//为了方便获取对象,我们使用Map集合来进行存储。
//解析得到的idName做为key,反射构建好的对象引用做为value
Map<String,Object> beanMap=new HashMap<String,Object>();
beanMap.put(idName,obj);
最后我们只需要编写getBean
方法将指定id
的对象进行返回即可:
public Object getBean(String id){
return beanMap.get(id);
}
通过容器获取并使用对象
现在我们已经完成了所有的准备工作,便可直接获取对象进行使用了:
public class Test {
public static void main(String[] args) {
ApplicationContext applicationContext=new ApplicationContext("beans.xml");
MyObj myObj = (MyObj) applicationContext.getBean("myObj");
System.out.println(myObj);
}
}
这样我们便只需要在beans.xml
文件中添加类的配置就可直接对其进行使用了,不需要使用原始的方式new
对象了。
编程要求
结合上两个章节所学知识点,使用Dom4j解析xml
和反射创建对象,我们自己来编写一个Spring
容器ApplicationContext
类,通过我们自己容器中的getBean()
获取对象。
在右侧编辑器中补充代码:
-
在
src/step3/beans.xml
文档中配置好Person
和Animal
类(注意类的全路径名) -
根据
ApplicationContext
类中的提示,完成解析xml
文档并获取对象方法的代码 -
在
Task
类中获取Person
和Animal
类,先后存入到List
集合中。
测试说明
平台会对你编写的代码进行测试:
预期输出:
Person类被成功获取
Animal类被成功获取
开始你的任务吧,祝你成功!
参考答案
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 {
public ApplicationContext(String file) {
init(file);
}
private Map<String,Object> beanMap=new HashMap<String,Object>();
private void init(String file) {
String className="",idName="";
Document doc = null;
try{
doc=new SAXReader().read("src/step3/beans.xml");
}catch(DocumentException e){
e.printStackTrace();
}
Element rootElm = doc.getRootElement();
List<Element> elms = rootElm.elements("bean");
Object obj=null;
for(int i=0;i<elms.size();i++){
idName=elms.get(i).attribute("id").getText();
className=elms.get(i).attribute("class").getText();
try{
obj=Class.forName(className).newInstance();
beanMap.put(idName,obj);
}catch(Exception e){
e.printStackTrace();
}
}
}
public Object getBean(String id){
Object obj=null;
obj = beanMap.get(id);
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<>();
ApplicationContext app = new ApplicationContext("src/step3/beans.xml");
Person person = (Person)app.getBean("person");
list.add(person);
Animal animal = (Animal)app.getBean("animal");
list.add(animal);
return list;
}
}