手写spring框架——第一篇

简介: 手写spring框架——第一篇

1.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<beans>
    <bean id="person" class="com.jd.xq.spring.bean.Person"/>
</beans>

2.XqClassPathXmlApplicationContext

(1)读取xml文件

(2)实例化bean—用反射的方式

package com.jd.xq.spring.context;
import com.jd.xq.spring.bean.BeanDefinition;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import java.net.URL;
import java.util.Iterator;
import java.util.*;
/**
 * @author
 * @Date 2019-12-27 11:38
 **/
public class XqClassPathXmlApplicationContext {
    private List<BeanDefinition> beanDefines = new ArrayList<BeanDefinition>();//用来存储所有的beans
    private Map<String, Object> sigletons = new HashMap<String, Object>();//用来存储实例化后的bean
    /**
     * 构造方法,用来模拟spring的行为
     *
     * @param fileName
     */
    public XqClassPathXmlApplicationContext(String fileName) {
        //1.read xml
        this.readXml(fileName);
        //2.实例化bean
        this.instanceBeans();
    }
    /**
     * 根据文件名读取xml的配置文件
     *
     * @param fileName
     * 
     */
    private void readXml(String fileName) {
        // TODO Auto-generated method stub
        //创建一个读取器
        SAXReader saxReader = new SAXReader();
        Document document = null;
        try {
            //获取要读取的配置文件的路径
            URL xmlPath = this.getClass().getClassLoader().getResource(fileName);
            //读取文件内容
            document = saxReader.read(xmlPath);
            //获取xml中的根元素
            Element rootElement = document.getRootElement();
            for (Iterator iterator = rootElement.elementIterator(); iterator.hasNext(); ) {
                Element element = (Element) iterator.next();
                String id = element.attributeValue("id");//获取bean的id属性值
                String clazz = element.attributeValue("class");//获取bean的class属性值
                BeanDefinition beanDefinition = new BeanDefinition(id, clazz);
                beanDefines.add(beanDefinition);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    /**
     * 实例化bean
     */
    private void instanceBeans() {
        if (beanDefines != null && beanDefines.size() > 0) {
            //对每个bean进行实例化
            for (BeanDefinition beanDefinition : beanDefines) {
                try {
                    //bean的class属性存在的时候才进行实例化,否则不进行实例化
                    if (beanDefinition.getClassName() != null && !beanDefinition.getClassName().equals("")) {
                        //实例化的关键操作
                        sigletons.put(beanDefinition.getId(), Class.forName(beanDefinition.getClassName()).newInstance());
                        System.out.println("id为:" + beanDefinition.getId() + "的bean实例化成功");
                    }
                } catch (Exception e) {
                    System.out.println("bean实例化失败");
                    e.printStackTrace();
                }
            }
        }
    }
    public Object getBean(String beanName) {
        return sigletons.get(beanName);
    }
}

3.解析xml工具类

package com.jd.xq.spring.utils;
import java.net.URL;
import java.util.Iterator;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
/**
 * @author 
 * @Date 2019-12-27 11:40
 **/
public class XmlParseUtil {
    @SuppressWarnings("rawtypes")
    public static void parseXml(String xmlPath) {
        SAXReader saxReader = new SAXReader();
        Document document = null;
        try {
            document = saxReader.read(xmlPath);
            //获取根节点
            Element elementRoot = document.getRootElement();
            System.out.println("根节点名称:" + elementRoot.getName());
            //遍历根节点下面的节点
            for (Iterator elementIterator = elementRoot.elementIterator(); elementIterator.hasNext(); ) {
                Element element = (Element) elementIterator.next();
                //获取节点的信息,,包括节点的名称以及节点的属性信息
                System.out.println("节点:" + element.getName());
                for (Iterator attrIterator = element.attributeIterator(); attrIterator.hasNext(); ) {
                    Attribute attr = (Attribute) attrIterator.next();
                    //节点的属性信息
                    System.out.println("节点的属性名称为:" + attr.getName() + ",值为:" + attr.getValue());
                }
                //获取节点下的子节点
                for (Iterator subElementiterator = element.elementIterator(); subElementiterator.hasNext(); ) {
                    Element subElement = (Element) subElementiterator.next();
                    //获取子节点的信息,包括子节点的名称以及子节点的属性信息
                    System.out.println("子节点:" + subElement.getName());
                    for (Iterator subElementAttrIterator = subElement.attributeIterator(); subElementAttrIterator.hasNext(); ) {
                        Attribute subElementAttr = (Attribute) subElementAttrIterator.next();
                        //子节点的属性信息
                        System.out.println("子节点的属性名称为:" + subElementAttr.getName() + ",值为:" + subElementAttr.getValue());
                    }
                }
            }
        } catch (Exception e) {
        }
    }
}

4.应用

package com.jd.xq.spring;
import com.jd.xq.spring.context.XqClassPathXmlApplicationContext;
/**
 * @author 
 * @Date 2019-12-27 11:52
 **/
public class SpringMain {
    public static void main(String[] args) {
        XqClassPathXmlApplicationContext xqClassPathXmlApplicationContext=new XqClassPathXmlApplicationContext("spring.xml");
        xqClassPathXmlApplicationContext.getBean("person");
    }
}

思路总结:

1.读取、解析xml文件

2.实例化bean(反射)

3.测试

源码地址:https://github.com/zhugezifang/my-spring-framework


相关文章
|
3月前
|
前端开发 Java 程序员
从零基础手写Spring MVC框架,准备好进阶程序员了吗?
我们程序员大部分人都是野路子,不懂什么叫代码规范。写了一个月的代码,最后还得其他老司机花3天时间重构,相信大部分老司机都很头疼看新手的代码。
25 1
|
6月前
|
Java 程序员 应用服务中间件
【推荐】深入浅出学习Spring框架【上】
【推荐】深入浅出学习Spring框架【上】
37 0
|
6月前
|
XML 前端开发 Java
源码分析系列教程(05) - 手写SpringMVC
源码分析系列教程(05) - 手写SpringMVC
20 0
|
6月前
|
XML Java Maven
源码分析系列教程(04) - 手写SpringIOC
源码分析系列教程(04) - 手写SpringIOC
22 0
|
5月前
|
XML Java 数据格式
手写spring 框架——第二篇(依赖注入)
手写spring 框架——第二篇(依赖注入)
41 0
|
6月前
|
Java 测试技术 API
源码分析系列教程(02) - 手写Spring事务框架
源码分析系列教程(02) - 手写Spring事务框架
52 0
|
4月前
|
XML Java 数据格式
Spring学习?这一篇文章就够,史上最全!
Spring学习?这一篇文章就够,史上最全!
|
5月前
|
Java Spring 容器
Spring框架讲解笔记:spring框架学习的要点总结
Spring框架讲解笔记:spring框架学习的要点总结
|
6月前
|
存储 监控 Java
【推荐】深入浅出学习Spring框架【中】
【推荐】深入浅出学习Spring框架【中】
25 0
|
9月前
|
设计模式 Java Spring
用300行代码手写1个Spring框架,麻雀虽小五脏俱全
为了解析方便,我们用application.properties来代替application.xml文件,具体配置内容如下:
28 0