思路:根据源码分析,将配置Bean类信息存放到xml文件中,通过解析xml,

然后反射拿到对象 存放到集合中 这里选择hashmap(键放置类名,值放置对象)存放,使用时使用get方法通过键(类名)拿到值(对象)。

后续需要优化的:自动清理缓存垃圾,因为初始化加载把所有的对象都存放进去,造成太多不必要的垃圾对象,导致占用内存,效率低。

1.导入主要工具包 dom4j.jar

2.创建一个javaBean类(注意要添加构造器,因为使用反射)

package com.ms.bean;

/*
*
* Person bean
* **/ public class Person { private String name;
private int age; public Person() {
super();
}
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public void info(){
System.out.println("this is a people");
System.out.println("name: "+getName()+" age: "+getAge());
}
}

 3.创建一个SpringBeanFactory工厂类

package com.ms.utils;

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.io.InputStream;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map; /**
*
* 模拟spring 加载xml配置文件(dom4j)
*
*/
public class SpringBeanFactory {
//初始化的bean全用map集合保存
public static Map<String,Object> beanMap = new HashMap<String, Object>(); /**
* 解析xml 并且保存到beanmap中
*
*/
public static void parse(String xml){
SAXReader reader = new SAXReader();
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
//从class目录下获取指定的xml
InputStream is = classLoader.getResourceAsStream(xml);
//根节点
Document doc=null;
try {
doc = reader.read(is);
Element rootElement = doc.getRootElement(); Element foo;
//用迭代器遍历bean
for (Iterator i =rootElement.elementIterator("bean");i.hasNext();){
foo = (Element) i.next();
//获取id和class
Attribute id = foo.attribute("id");
Attribute aClass = foo.attribute("class");
//利用反射机制获取Class对象
Class bean = Class.forName(aClass.getText());
//获取class信息
BeanInfo info = Introspector.getBeanInfo(bean);
//获取其属性描述
PropertyDescriptor pd[] = info.getPropertyDescriptors();
//设置方法
Method mSet = null;
//创建一个对象
Object obj = bean.newInstance();
//遍历该bean的property属性
for (Iterator ite = foo.elementIterator("property");ite.hasNext();){
Element foo2 = (Element) ite.next();
//获取name的属性
Attribute name = foo2.attribute("name");
//获取value值
Attribute value = foo2.attribute("value");
for (PropertyDescriptor pp : pd) {
if (pp.getName().equalsIgnoreCase(name.getText())){
mSet = pp.getWriteMethod();
Class<?>[] types = mSet.getParameterTypes();
for (Class<?> type : types) {
if (type.getName().equals("int")){
//转换为整型
mSet.invoke(obj,Integer.parseInt(value.getText()));
}else {
//利用java反射调用set方法
mSet.invoke(obj,value.getText());
}
} }
}
}
beanMap.put(id.getText(),obj);
}
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NumberFormatException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IntrospectionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} }
}

 4.创建一个mySpringBean.xml 放置在src目录下面

<?xml version="1.0" encoding="UTF-8"?>
<beans>
<bean id="person" class="com.ms.bean.Person">
<property name="name" value="jack"/>
<property name="age" value="20"/>
</bean> </beans>

 5.创建测试类

package test;

import org.junit.Test;

import com.ms.bean.Person;
import com.ms.dao.IString;
import com.ms.dao.myString;
import com.ms.utils.SpringBeanFactory; /**
* this is a test
*
* */ public class test { public test() {
SpringBeanFactory.parse("myStringBean.xml");
} @Test
public void testPerson(){ Person person = (Person)SpringBeanFactory.beanMap.get("person");
person.info();
} }

  6.输出结果如图所示

模拟stringBeanFactory解析xml的更多相关文章

  1. 使用JDom解析XML文档模拟Spring的配置文件解析

    在J2EE项目中可能会涉及到一些框架的使用,最近接触到了SSH,拿Spring来说配置文件的使用是相当重要的,Spring的配置文件是一个xml文件,Spring是如何读取到配置文件并进行依赖注入的呢 ...

  2. Java从零开始学四十二(DOM解析XML)

    一.DOM解析XML xml文件 favorite.xml <?xml version="1.0" encoding="UTF-8" standalone ...

  3. Android网络之数据解析----SAX方式解析XML数据

    ​[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...

  4. (四)SAX方式解析XML数据

    SAX方式解析XML数据 ​文章来源:http://www.cnblogs.com/smyhvae/p/4044170.html 一.XML和Json数据的引入: 通常情况下,每个需要访问网络的应用程 ...

  5. Android -- 创建XML文件对象及其序列化, pull解析XML文件

    1. 创建XML文件对象及其序列化 示例代码:(模拟以xml格式备份短信到SD卡) SmsInfo.java, bean对象 /** * 短信的业务bean * @author Administrat ...

  6. JQuery -- Jquery 中的Ajax, Jquery解析xml文件

    1. JQuery 对 Ajax 操作进行了封装,在 jQuery 中最底层的方法时 $.ajax(), 第二层是 load(), $.get() 和 $.post(),第三层是$.getScript ...

  7. 扒一扒spring,dom4j实现模拟实现读取xml

    今天leadr提出需求,原来公司项目中读取解析xml文件的代码效率太低,考虑切换一种xml为数据封装格式与读取方式以提高效率.我这灵机一动spring对bean的依赖注入就是读取xml文件,可以尝试扒 ...

  8. 网络相关系列之四:数据解析之SAX方式解析XML数据

    一.XML和Json数据的引入: 通常情况下.每一个须要訪问网络的应用程序都会有一个自己的server.我们能够向server提交数据,也能够从server获取数据.只是这个时候就有一个问题,这些数据 ...

  9. Android 解析XML文件和生成XML文件

    解析XML文件 public static void initXML(Context context) { //can't create in /data/media/0 because permis ...

随机推荐

  1. C# -- 使用FileInfo获取文件信息

    C# -- 使用FileInfo获取文件信息 1. 代码实现 static void Main(string[] args) { GetFileInfo(@"D:\Test.xlsx&quo ...

  2. C++11のlambd表达式

    在其他语言中,我们常见lambda表达式,c++11中也引入了. 利用Lambda表达式,可以方便的定义和创建匿名函数.今天,我们就来简单介绍一下C++中Lambda表达式的简单使用. 一.lambd ...

  3. [十二省联考2019]D2T2春节十二响

    嘟嘟嘟 这题真没想到这么简单-- 首先有60分大礼:\(O(n ^ 2logn)\)贪心.(我也不知道为啥就是对的) 然后又送15分链:维护两个堆,每次去堆顶的最大值. 这时候得到75分已经很开心了, ...

  4. Reason的介绍和搭建Reason开发环境

    Reason介绍 Reason是在Ocaml语言的基础上修改而来,专门提供给前端开发者使用. Reason是函数式编程语言,使用Bucklescript编译器编译成javascript语言. 在我看来 ...

  5. EasyUI的Datagrid鼠标悬停显示单元格内容

    功能描述:table鼠标悬停显示单元格内容 1.js函数 function hoveringShow(value) { return "<span title='" + va ...

  6. OpenStack之Fuel架构及其工作原理

      一.Fuel架构 Fuel是一个开源的OpenStack部署和管理的工具,它允许用户通过Web UI进行OpenStack的部署和管理,并可以通过插件来扩展. Fuel的目标:加快和简化不同配置的 ...

  7. mysql原生语句基础知识

    要操作数据库,首先要登录mysql: *mysql -u root -p 密码 创建数据库: *create database Runoob(数据库名); 删除数据库: *drop database ...

  8. JAVA流读取文件并保存数据

    如图有文本如下数据 写方法读取数据 private String[][] getData(){ // 使用ArrayList来存储每行读取到的字符串 ArrayList<String> a ...

  9. 第一章 Python基本语法元素

    1.1   程序设计基本方法 计算机的概念: (1)功能性:对数据的操作,表现为数据计算.输出输出处理和结果存储等 (2)可编程性:根据一系列指令自动地.可预测地.准确地完成操作者的意图. 计算机的发 ...

  10. QProcess与外部程序的调用

    项目做到一定阶段,常常须要在原来的project上调用外部程序. Qt为此提供了QProcess类,QProcess可用于完毕启动外部程序,并与之交互通信. 一.启动外部程序的两种方式:(1)一体式: ...