目录

任务描述

相关知识

编程要求

测试说明

参考答案


任务描述

本关任务:利用Dom4j解析xml文档和反射机制实现Spring获取对象原理。

相关知识

为了完成本关任务,你需要掌握:Spring是如何获取并使用配置文件中的对象?

实现过程我们可以分三步来实现:

  1. 模仿Spring的配置文件,
  2. 模仿SpringApplicationContext容器,
  3. 通过容器获取并使用对象。

仿 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()获取对象。

在右侧编辑器中补充代码:

  1. src/step3/beans.xml文档中配置好PersonAnimal类(注意类的全路径名)
  2. 根据ApplicationContext类中的提示,完成解析xml文档并获取对象方法的代码
  3. Task类中获取PersonAnimal类,先后存入到List集合中。

测试说明

平台会对你编写的代码进行测试:

预期输出:

  1. Person类被成功获取
  2. 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;
	}
}

spring获取实体类属性对应的数据库字段_mybatis