赞
踩
- package com.xyd.Spring;
-
- import org.dom4j.Document;
- import org.dom4j.Element;
- import org.dom4j.Node;
- import org.dom4j.XPath;
- import org.dom4j.io.SAXReader;
-
- import java.net.URL;
- import java.util.*;
-
- /**
- * 模拟Spring的实现
- * 1.通过带参构造器得到对应的配置文件
- * 2.通过我们的dom4j解析我们的xml文件 得到一个list集合 存放bean标签id和class 属性
- * 3.通过反射得到对应的实例化对象 遍历集合 通过过去对应的class属性 利用class.forName(class).newInstance
- * 4.通过id属性值 获取指定的实例化对象
- * 5.
- */
- public class MyClassPathXmlApplicationContext implements MyFactory {
- //private List<MyBean> beanList; //存放从配置文件中获取到的bean标签的信息 Mybean 代表的就是每一个bean标签
- List<MyBean> beanList = new ArrayList<>();
- //private Map<String, Object> beanMap = new HashMap<>();//存放实例化好的对象 通过id获取对应的对象
- Map<String, Object> beanMap = new HashMap<>();
- //1.通过带参构造器得到对应的配置文件
- public MyClassPathXmlApplicationContext(String fileName) {
- /*2.通过我们的dom4j解析我们的xml文件 得到一个list集合 存放bean标签id和class 属性*/
- this.parseXml(fileName);
- this.instanceBean();
- }
-
- /**
- * 通过dom4j 解析xml文件 得到list集合
- * 1.获取解析器
- * 2.获取文件的配置
- * 3.通过解析器解析配置文件
- * 4.通过xpath 语法解析 获取beans标签下的所有bean标签
- * 5.通过制定的解析语法 解析文档对象 返回元素集合
- * 6.判断元素集合是否为空
- * 7.判断元素结合不为空 遍历集合
- * 8.获取bean标签元素的属性 id h和class
- * 9.获取Mybean 对象 将id 和class 属性设置到对象中 再将对象设置到MyBean的集合中
- *
- * @param fileName
- */
- private void parseXml(String fileName) {
- //1.获取解析器
- SAXReader saxReader = new SAXReader();
- //2.获取配置文件的URL
- URL url = this.getClass().getClassLoader().getResource(fileName);
-
- try {
- //3.通过解析器 配置文件 xml
- Document document = saxReader.read(url);
- //4.通过xpath 语法解析 获取beans标签下的所有bean标签
- XPath xPath = document.createXPath("beans/bean");
- //5.通过制定的解析语法 解析文档对象 返回元素集合
-
- /* dom4j由1.6.1更新到2.1.3后,List<Node>无法自动转换为List<Element>,因此需要在遍历时将List中的Node元素单独转换为Element*/
- //List<Element> elementList = xPath.selectNodes(document);
-
- List<Node> selectList = xPath.selectNodes(document);
-
- if (selectList != null && selectList.size() > 0) {
-
- for (Node node : selectList) {
- //8.获取bean标签元素的属性 id h和class
- Element selectElement = (Element) node;
- //取出id属性的值
- String id = selectElement.attributeValue("id");
- String aClass = selectElement.attributeValue("class");
- //9.获取Mybean 对象 将id 和class 属性设置到对象中 再将对象设置到MyBean的集合中
- MyBean myBean = new MyBean();
- myBean.setId(id);
- myBean.setClazz(aClass);
-
- beanList.add(myBean);
- }
- }
- // // 6.判断元素集合是否为空
- // if (elementList != null && elementList.size() > 0) {
- // //实例化
- // beanList = new ArrayList<>();
- // //7.判断元素结合不为空 遍历集合
- // for (Element node : elementList) {
- // //8.获取bean标签元素的属性 id h和class
- // String id = node.attributeValue("id");
- // String aClass = node.attributeValue("class");
- // //9.获取Mybean 对象 将id 和class 属性设置到对象中 再将对象设置到MyBean的集合中
- // MyBean myBean = new MyBean(id, aClass);
- // beanList.add(myBean);
- // }
- // }
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
-
- /**
- * 通过反射得到对应的实例化对象 防止Map对象
- * 1.判断对象集合是否为空 如果不为空 则遍历集合获取对象id
- * 2.通过类的全路径 反射得到实例化对象
- * 3.将对应的id和实例化的bean 对象设置到Map 对象中
- */
- private void instanceBean() {
- //1.判断对象集合是否为空 如果不为空 则遍历基金和 获取对象id
- if (beanList != null && beanList.size() > 0) {
- for (MyBean bean : beanList) {
- String id = bean.getId();
- String clazz = bean.getClazz();
- try {
- //2.通过类的全路径 反射得到实例化对象
- Object o = Class.forName(clazz).newInstance();
- //3.将对应的id和实例化的bean 对象设置到Map 对象中
- beanMap.put(id, o);
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
- }
-
-
- /**
- * 通过id 获取对应的Map 对象中的value
- *
- * @param id
- * @return
- */
- @Override
- public Object getBean(String id) {
- Object object = beanMap.get(id);
- return object;
- }
- }

编译时报的错误:dom4j 不兼容的类型: java.util.List<org.dom4j.Node>无法转换为java.util.List<org.dom4j.Element>
在遍历时将List中的Node元素单独转换为Element
- package com.xyd;
-
- import com.xyd.Service.UserService;
- import com.xyd.Spring.MyClassPathXmlApplicationContext;
- import com.xyd.Spring.MyFactory;
- import com.xyd.Dao.UserDao;
-
- /**
- * Hello world!
- */
- public class App {
- public static void main(String[] args) {
- //得到工厂的实现对象
- MyFactory factory = new MyClassPathXmlApplicationContext("spring.xml");
- //得到对应的实例化对象
- UserDao userDao = (UserDao) factory.getBean("userDao");
- userDao.test();
- UserService userService = (UserService) factory.getBean("userService");
- userService.test();
- }
- }

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。