首页 > 其他 > 详细

模拟stringBeanFactory解析xml

时间:2019-02-24 17:18:37      阅读:204      评论:0      收藏:0      [点我收藏+]

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

原文:https://www.cnblogs.com/ysg520/p/10426825.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!