我是靠谱客的博主 眯眯眼鞋子,最近开发中收集的这篇文章主要介绍【Spring】带你简单了解 Spring 解析 XML 配置的机制,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

前言:距离上次更新已经一个月,最近一个月学习了一下Vue3、微服务、开始做一个OA系统、准备面试…。效率不太高。

1. 需求说明

自己写一个简单的Spring容器,通过读取beans.xml,获取第1个JavaBean: Monster的对象,并给该的对象属性赋值,输出该对象信息.
在这里插入图片描述

不使用Spring原生框架,我们自己简单模拟实现,让大家了解Spring容器的简单机制

2. 思路分析

  1. 使用xml的解析技术-Dom4j
  2. 读取beans.xml
  3. 解析得到monster对象的id,classpath,属性
  4. 使用反射,创建对象
  5. 放入到ioc容器(hashmap)
  6. 提供一个getBean方法

DOM4j技术文章:XML 解析技术:DOM4j

3. 完成步骤

注:想使用SAXReader类必须导入DOM4j的包或者依赖
1. 创 建 HJApplicationContext.java

import com.hj.spring.bean.Monster;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import java.io.File;
import java.lang.reflect.Method;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 1. 这个程序用于实现Spring的一个简单容器机制
 * 2. 后面我还会详细的实现
 * 3. 这里我们实现如何将beans.xml文件进行解析,并生成对象,放入容器中
 * 4. 提供一个方法 getBean(id) 返回对应的对象
 * 5. 这里就是一个开胃小点心, 理解Spring容器的机制
 */
public class HJApplicationContext {

    private ConcurrentHashMap<String, Object> singletonObjects =
            new ConcurrentHashMap<>();


    //构造器
    //接收一个容器的配置文件 比如 beans.xml, 该文件默认在src
    public HJApplicationContext(String iocBeanXmlFile) throws Exception {

        //1. 得到类加载路径
        String path = this.getClass().getResource("/").getPath();

        //2. 创建 Saxreader
        SAXReader saxReader = new SAXReader();

        //3. 得到Document对象
        Document document =
                saxReader.read(new File(path + iocBeanXmlFile));

        //4. 得到rootDocument
        Element rootElement = document.getRootElement();

        //5. 得到第一个bean-monster01
        Element bean = (Element) rootElement.elements("bean").get(0);

        //6. 获取到第一个bean-monster01的相关属性
        String id = bean.attributeValue("id");
        String classFullPath = bean.attributeValue("class");
        List<Element> property = bean.elements("property");
        //遍历->简化直接获取
        Integer monsterId =
                Integer.parseInt(property.get(0).attributeValue("value"));

        String name = property.get(1).attributeValue("value");
        String skill = property.get(2).attributeValue("value");

        //7. 使用反射创建对象.=> 回顾反射机制
        Class<?> aClass = Class.forName(classFullPath);
        //这里o对象就是Monster对象
        Monster o = (Monster) aClass.newInstance();
        //给o对象赋值
        //反射来赋值=> 这里简化,直接赋值->目的就是先理解流程
        //这里的方法就是setter方法
        //Method[] declaredMethods = aClass.getDeclaredMethods();
        //for (Method declaredMethod : declaredMethods) {
        //    declaredMethod.invoke();
        //}
        //赋值
        o.setMonsterId(monsterId);
        o.setName(name);
        o.setSkill(skill);

        //8. 将创建好的对象放入到singletonObjects
        singletonObjects.put(id, o);

    }

    public Object getBean(String id) {
        return singletonObjects.get(id);
    }
}

2. 配置文件如图
在这里插入图片描述

3. 创建测试类HJApplicationContextTest

import com.hj.spring.bean.Monster;

/**
 * @author hj
 */
public class HJApplicationContextTest {
    public static void main(String[] args) throws Exception {

        HJApplicationContext ioc =
                new HJApplicationContext("beans.xml");

        Monster monster01 = (Monster)ioc.getBean("monster01");

        System.out.println("monter01=" + monster01);
        System.out.println("monster01.name=" + monster01.getName());
    }
}

最后

以上就是眯眯眼鞋子为你收集整理的【Spring】带你简单了解 Spring 解析 XML 配置的机制的全部内容,希望文章能够帮你解决【Spring】带你简单了解 Spring 解析 XML 配置的机制所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(78)

评论列表共有 0 条评论

立即
投稿
返回
顶部