实现简单Spring基于XML的配置程序

news2024/11/24 2:46:06

定义一个容器,使用ConcurrentHashMap 做为单例对象的容器

  1. 先解析beans.xml
  2. 得到第一个bean对象的信息,id,class,属性和属性值
  3. 使用反射生成对象,并赋值
  4. 将创建好的bean对象放入到singletonObjects集合中
  5. 提供getBean(id)方法可以返回对应的bean对象

monster bean

public class Monster {
    private Integer id;
    private String name;
    private String skill;

    public Monster() {
    }


    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSkill() {
        return skill;
    }

    public void setSkill(String skill) {
        this.skill = skill;
    }

    @Override
    public String toString() {
        return "Monster{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", skill='" + skill + '\'' +
                '}';
    }
}

package com.sparrow.spring.application;

import com.sparrow.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.util.List;
import java.util.concurrent.ConcurrentHashMap;

/**
 * @Author: 诉衷情の麻雀
 * @Description: TODO
 * @DateTime: 2023/7/24 8:09
 **/
public class SpaApplicationContext {
    private ConcurrentHashMap<String, Object> singletonObjects = new ConcurrentHashMap<>();


    //构造器 接收一个容器的配置文件
    public SpaApplicationContext(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.得到rootElement
        Element rootElement = document.getRootElement();

        List<Element> elements = rootElement.elements("bean");
        for (Element bean : elements) {
            String id = bean.attributeValue("id");
            String classFullPath = bean.attributeValue("class");
            Integer monsterId = null;
            String name = "";
            String skill = "";
            //遍历bean下面的property属性
            List<Element> property = bean.elements("property");
            for (Element elementProperty : property) {
                //如果是id把值存起来
                if ("id".equalsIgnoreCase(elementProperty.attributeValue("name"))) {
                    monsterId = Integer.valueOf(elementProperty.attributeValue("value"));
                } else if ("name".equalsIgnoreCase(elementProperty.attributeValue("name"))) {
                    name = elementProperty.attributeValue("value");
                } else if ("skill".equalsIgnoreCase(elementProperty.attributeValue("name"))) {
                    skill = elementProperty.attributeValue("value");
                }

                //利用反射 根据类的全路径 进行实例化
                Class<?> aClass = Class.forName(classFullPath);
                Monster o = (Monster) aClass.newInstance();
                o.setId(monsterId);
                o.setName(name);
                o.setSkill(skill);
                
                //放入容器中
                singletonObjects.put(id, o);
            }


        }
    }

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

beans.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean class="com.sparrow.spring.bean.Monster" id="monster01">
        <property name="id" value="1"/>
        <property name="name" value="白骨精"/>
        <property name="skill" value="吃唐僧"/>
    </bean>
    <bean class="com.sparrow.spring.bean.Monster" id="monster02">
        <property name="id" value="2"/>
        <property name="name" value="老鼠精"/>
        <property name="skill" value="吸血"/>
    </bean>

</beans>
public class Test {
    public static void main(String[] args) throws Exception {
        SpaApplicationContext spaApplicationContext = new SpaApplicationContext("beans.xml");
        Monster monster02 = (Monster) spaApplicationContext.getBean("monster02");
        Monster monster01 = (Monster) spaApplicationContext.getBean("monster01");
        System.out.println(monster02);
        System.out.println(monster01);
    }
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/784292.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Nodejs】Node.js开发环境安装

1.版本介绍 在命令窗口中输入 node -v 可以查看版本 0.x 完全不技术 ES64.x 部分支持 ES6 特性5.x 部分支持ES6特性&#xff08;比4.x多些&#xff09;&#xff0c;属于过渡产品&#xff0c;现在来说应该没有什么理由去用这个了6.x 支持98%的 ES6 特性8.x 支持 ES6 特性 2.No…

下载python模块包

离线安装 在PyPI The Python Package Index 查找自己需要的安装包&#xff0c;直接下载对应操作系统的安装包即可 拿numpy举个例子&#xff0c;上面有好多类型的安装包&#xff0c;针对不同的操作系统&#xff0c;其中在文件名中可以看出有linus和macos等等&#xff0c;此外还…

论文笔记--Distilling the Knowledge in a Neural Network

论文笔记--Distilling the Knowledge in a Neural Network 1. 文章简介2. 文章概括3 文章重点技术3.1 Soft Target3.2 蒸馏Distillation 4. 文章亮点5. 原文传送门 1. 文章简介 标题&#xff1a;Distilling the Knowledge in a Neural Network作者&#xff1a;Hinton, Geoffre…

Macbook M1编译安装Java OpenCV

OpenCV-4.8.0编辑安装 查询编译依赖 brew info opencv确保所有需要模块都打上了✔&#xff0c;未打✔的需要使用brew进行安装 下载OpenCV源码 在此处下载OpenCV源代码&#xff0c;选择Source&#xff0c;点击此处下载opencv_contrib-4.8.0 或者使用如下命令&#xff0c;通…

gerrit 从安装到出坑

一般公司在做代码审核的时候选择codereview gerrit来处理代码的入库的问题。 它是通过提交的时候产生Change-Id: If4e0107f3bd7c5df9e2dc72ee4beb187b07151b9 来决定是不是入库&#xff0c;一般如果不是通过这个管理&#xff0c;那么就是我们通常的操作 git add . git comm…

【算法与数据结构】110、LeetCode平衡二叉树

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析&#xff1a;二叉树遍历一共有前中后遍历和层序遍历&#xff0c;这道题只有后序遍历适合&#xff0c;求深度是从上往…

【小黄碎碎念】如何解析和替换字符串中的 Markdown 文本?正则表达式与 flexmark-java 库

前言 本周&#xff0c;笔者将之前的基于 Servlet 的个人博客项目进行了迭代&#xff0c;基于 SpringBoot SpringMVC Mybatis Redis 进行实现。额外实现密码的明文加密处理&#xff08;加盐算法&#xff09;、修改博客、公共主页等功能&#xff0c;并将 session 存储到 Redis…

深度学习——批标准化Batch Normalization

什么是批标准化&#xff1f; 批标准化&#xff08;Batch Normalization&#xff09;是深度学习中常用的一种技术&#xff0c;旨在加速神经网络的训练过程并提高模型的收敛速度。 批标准化通过在神经网络的每一层中对输入数据进行标准化来实现。具体而言&#xff0c;对于每个输…

我在VScode学Python(Python函数,Python模块导入)

我的个人博客主页&#xff1a;如果’真能转义1️⃣说1️⃣的博客主页 &#xff08;1&#xff09;关于Python基本语法学习---->可以参考我的这篇博客《我在VScode学Python》 &#xff08;2&#xff09;pip是必须的在我们学习python这门语言的过程中Python ----&#xff1e;&a…

fl studio 20如何设置中文汉化汇总及flstudio21水果language选项中文设置方法

fl studio这是一个编曲软件&#xff0c;它有中文和英文两种语言供大家选择&#xff0c;对我们来说&#xff0c;中文版肯定更方便。fl studio如何设置中文&#xff1f;事实上&#xff0c;只需在设置中切换中文即可。 我们一起 fl studio 20如何设置中文一些方法 一、fl studio手…

Angular:动态依赖注入和静态依赖注入

问题描述&#xff1a; 自己写的服务依赖注入到组件时候是直接在构造器内初始化的。 直到看见代码中某大哥写的 private injector: Injector 动态依赖注入和静态依赖注入 在 Angular 中&#xff0c;使用构造函数注入的方式将服务注入到组件中是一种静态依赖注入的方式。这种方…

docker中搭建lnmp

目录 一&#xff1a;项目环境 1、主机ip需求 2、 任务需求 二&#xff1a;多级构建Dockerfile实验部署 lnmp 1、先部署一个有所有依赖包的镜像 2、搭建nginx 3、搭建mysql 4、搭建php 三&#xff1a;一级构建安装lnmp 1、构建自定义docker网络 2、构建nginx容器&#x…

办公室安全升级,如何保障人身财产安全?

视频监控&#xff0c;一种常见的安全措施&#xff0c;以监视和记录办公室内的活动。这项技术为企业提供了许多优势&#xff0c;包括保障员工和财产安全、帮助调查犯罪事件、提高业务管理效率以及应对突发事件。 因此&#xff0c;在合理范围内应用视频监控&#xff0c;将为企业提…

LINUX中的myaql(一)安装

目录 前言 一、概述 二、数据库类型 三、数据库模型 四、MYSQL的安装 &#xff08;一&#xff09;yum安装MYSQL &#xff08;二&#xff09;rpm安装MYSQL 五、MYSQL本地登录 rpm安装MYSQL本地登录 六、重置密码 总结 前言 MySQL是一种常用的开源关系型数据库管理系统&#xff…

泛微OA客戶管理融合呼叫中心系统功能

泛微OA&#xff0c;全程数字化运营平台。用户因业务管理需要&#xff0c;crm客户管理流程中&#xff0c;需要通过语音与客户沟通&#xff0c;对话务沟通过程实现流程和过程化管理。 泛微OA中&#xff0c;无需过多编程代码。通过呼叫中心接口快速开发&#xff0c;实现点击拨打&…

【计算机网络】第 3 课 - 计算机网络体系结构

欢迎来到博主 Apeiron 的博客&#xff0c;祝您旅程愉快 &#xff01; 时止则止&#xff0c;时行则行。动静不失其时&#xff0c;其道光明。 目录 1、常见的计算机网络体系结构 2、计算机网络体系结构分层的必要性 2.1、物理层 2.2、数据链路层 2.3、网路层 2.4、运输层 2…

融合正余弦和柯西变异的麻雀搜索算法优化CNN-BiLSTM,实现多输入单输出预测,MATLAB代码...

上期作者推出的融合正余弦和柯西变异的麻雀优化算法&#xff0c;效果着实不错&#xff0c;今天就用它来优化一下CNN-BiLSTM。CNN-BiLSTM的流程&#xff1a;将训练集数据输入CNN模型中&#xff0c;通过CNN的卷积层和池化 层的构建&#xff0c;用来特征提取&#xff0c;再经过BiL…

(20)操纵杆或游戏手柄

文章目录 前言 20.1 你将需要什么 20.2 校准 20.3 用任务规划器进行设置 20.4 飞行前测试控制装置 20.5 测试失控保护 20.6 减少控制的滞后性 前言 本文解释了如何用操纵杆或游戏手柄控制你的飞行器&#xff0c;使用任务计划器向飞行器发送"RC Override"消息…

【C++基础(六)】类和对象(中) --构造,析构函数

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:C初阶之路⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习C   &#x1f51d;&#x1f51d; 类和对象-中 1. 前言2. 构造函数3. 构造函数的特性4…