当前位置: 首页 > news >正文

简单实现spring的set依赖注入

 Maven依赖:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.myspringframework</groupId><artifactId>myspring</artifactId><version>1.0-SNAPSHOT</version>
<!--    打包方式 jar--><packaging>jar</packaging><properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies>
<!--  dom4j是一个能够解析XML文件的java组件      --><dependency><groupId>dom4j</groupId><artifactId>dom4j</artifactId><version>1.1</version></dependency>
<!--  使用xpath时dom4j.jar会依赖jaxen,所以需要引入jaxen包。--><dependency><groupId>jaxen</groupId><artifactId>jaxen</artifactId><version>1.2.0</version></dependency>
<!--   引入测试依赖     --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.2</version><scope>test</scope></dependency></dependencies>
</project>
public interface ApplicationContext {/*** 根据bean的名字获取对应的bean对象* @param beanName  myspring配置文件中bean标签的id* @return 对应的bean对象*/<T> T getBean(String beanName,Class<T> type);Object getBean(String beanName);
}
public class ClassPathXmlApplicationContext implements ApplicationContext{
//    对应一级缓存private Map<String,Object> singletonObject=new HashMap<>();/*** 解析myspring的配置文件,然后初始化所有的bean对象。* @param configLocation Spring配置文件的路径,注意,使用ClassPathXmlApplicationContext,配置文件应放在类路径中*/public ClassPathXmlApplicationContext(String configLocation) {
//    解析myspring.xml配置文件,实例化bean,把bean放到集合中try {
//           获取一个解析器对象SAXReader saxReader=new SAXReader();
//        获取所要读取的文件的输入流URL resource = ClassLoader.getSystemClassLoader().getResource(configLocation);
//           获取文档对象Document document = saxReader.read(resource);
//           获取指定标签      //bean 表示获得多个bean标签List beans = document.selectNodes("//bean");
//          遍历所有的bean并放到集合中beans.forEach(new Consumer() {@Overridepublic void accept(Object o) {//向下转型,拥有更丰富的方法Element element= (Element) o;//获取bean后,再获取属性值id和class    注:class是全类名String id = element.attributeValue("id");String className = element.attributeValue("class");try {//有了类名后,直接反射创建对象Class clazz= Class.forName(className);//获取无参构造方法Constructor declaredConstructor = clazz.getDeclaredConstructor();//创建对象并放到map中 进行曝光Object bean = declaredConstructor.newInstance();singletonObject.put(id,bean);} catch (Exception e) {e.printStackTrace();throw new RuntimeException(e);}}});
//           进行set注入,为属性赋值//首先得获得<property />标签,获取其中的属性name和value  或是 name和refbeans.forEach(new Consumer() {@Overridepublic void accept(Object o) {try {//获取bean的id和classNameElement element= (Element) o;String className=element.attributeValue("class");String id=element.attributeValue("id");//获取 <bean/>中的所有<property>标签List properties = element.elements();//遍历该bean所有<property>标签properties.forEach(new Consumer() {@Overridepublic void accept(Object o) {Element property= (Element) o;String fieldName = property.attributeValue("name");String propertyValue = property.attributeValue("value");String ref = property.attributeValue("ref");try {//利用反射Object bean=singletonObject.get(id);//获取set()方法String setMethodName="set"+fieldName.toUpperCase().charAt(0)+fieldName.substring(1);//获取全限定类型名Class propertyType= bean.getClass().getDeclaredField(fieldName).getType();//如果所获取的方法有参数的话,需要加上参数类型Method setMethod = bean.getClass().getDeclaredMethod(setMethodName,propertyType);//获取bean的set方法if(propertyValue!=null){Object propertyVal=null;//对于基本数据类型,如果想要调用相应的set方法,必须知道类型是什么String propertyTypeSimpleName=propertyType.getSimpleName();switch (propertyTypeSimpleName) {case "byte": case "Byte":propertyVal = Byte.valueOf(propertyValue);break;case "short": case "Short":propertyVal = Short.valueOf(propertyValue);break;case "int": case "Integer":propertyVal = Integer.valueOf(propertyValue);break;case "long": case "Long":propertyVal = Long.valueOf(propertyValue);break;case "float": case "Float":propertyVal = Float.valueOf(propertyValue);break;case "double": case "Double":propertyVal = Double.valueOf(propertyValue);break;case "boolean": case "Boolean":propertyVal = Boolean.valueOf(propertyValue);break;case "char": case "Character":propertyVal = propertyValue.charAt(0);break;case "String":propertyVal = propertyValue;break;}setMethod.invoke(singletonObject.get(id), propertyVal);}else if(ref!=null){//这个简单,直接把所需要的曝光后的对象赋值给它就行。setMethod.invoke(bean,singletonObject.get(ref));}} catch (Exception e) {e.printStackTrace();}}});} catch (Exception e) {throw new RuntimeException(e);}}});}catch (Exception e){e.printStackTrace();}}
//    加个泛型@Overridepublic <T> T getBean(String beanName,Class<T> type) {return (T)singletonObject.get(beanName);}@Overridepublic Object getBean(String beanName) {return singletonObject.get(beanName);}}

相关文章:

简单实现spring的set依赖注入

Maven依赖: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0…...

STM32 HAL库函数——HAL_TIM_Base_Start_IT()详解

以STM32G030C8T6中的HAL_TIM_Base_Start_IT()函数为例&#xff0c;进行解释&#xff1b; 文章目录 一、函数原型和源代码二、函数用法详解&#xff1a;2.1 参数2.1.1 TIM_HandleTypeDef结构体详解 2.2 使用场景&#xff1a;2.3 使用方法&#xff1a; 三、函数使用示例&#xff…...

C语言之通讯录的实现篇优化版

目录 动态内存管理 通讯录声明 静态版本 动态版本 ​初始化通讯录 静态版本 动态版本 Add增加通讯录 静态版本 动态版本 Checkcapacity增容 DestroyContact释放动态空间 文件操作 SaveContact保存信息到文件中 初始化通讯录 旧版本 文件版本 LoadContact加载…...

C++17中std::string_view的使用

为了解决std::string初始化(或拷贝)成本高昂的问题&#xff0c;C17引入了std::string_view。std::string_view提供对现有字符串(C风格字符串、std::string、或另一个std::string_view)的只读访问&#xff0c;而无需进行拷贝。当想要有效地处理和操作字符串而不修改它们时&#…...

C#,数值计算——分类与推理Phylo_nj的计算方法与源程序

1 文本格式 using System; using System.Collections.Generic; namespace Legalsoft.Truffer { public class Phylo_nj : Phylagglom { public double[] u; public override void premin(double[,] d, int[] nextp) { i…...

element-ui 图片压缩上传

picture.js export const compressImgNew (file) > {return new Promise(resolve > {const reader new FileReader()const image new Image()image.onload (imageEvent) > {const canvas document.createElement(canvas) // 创建画布const context canvas.getCo…...

【Java 进阶篇】Java XML约束:确保数据一致性和有效性

XML&#xff08;可扩展标记语言&#xff09;是一种常用的数据交换格式&#xff0c;用于存储和交换数据。然而&#xff0c;为了确保数据的一致性和有效性&#xff0c;通常需要定义XML约束。XML约束是一种规则集&#xff0c;定义了XML文档的结构、元素、属性和数据类型。本篇博客…...

第一章概述

一、学习目的与要求 本章对软件测试作了概括性的介绍&#xff0c;目的是使学生对软件测试有个初步的认识。通过本章的学习&#xff0c;应使学生掌握软件测试的基本概念&#xff0c;了解软件测试的发展历程和行业现状&#xff0c;掌握软件测试技术的分类&#xff0c;理解软件测试…...

XCode15与iOS17/17.1 真机测试问题处理

XCode15与iOS17/17.1 真机测试问题处理&#xff0c;网上相关博客很多&#xff0c;摘录了如下实践后能起作用的地址如下&#xff1a;Xcode 15 报错处理 - 简书iOS17版本适配-CSDN博客 Xcode15适配-六虎 主要介绍下&#xff1a;Assertion failure in void _UIGraphicsBeginImag…...

使用 Rust 和 cURL 库下载程序

以下是一个使用 Rust 和 cURL 库的下载器程序&#xff0c;用于下载 图像。此程序使用了 https://www.duoip.cn/get_proxy 的代码。 extern crate curl; ​ use std::io::{self, Read}; use std::error::Error; ​ fn main() {let url "https://www.baidu.com";let …...

三维模型表面积计算方法

【版权声明】 本文为博主原创文章&#xff0c;未经博主允许严禁转载&#xff0c;我们会定期进行侵权检索。 更多算法总结请关注我的博客&#xff1a;https://blog.csdn.net/suiyingy&#xff0c;或”乐乐感知学堂“公众号。 本文章来自于专栏《Python三维模型处理基础》的系列文…...

unity脚本_力 c#

创建一个脚本 将代码挂载到物体上 取消物体的重力 运行即向z轴运动 加力之后 是否停止是由阻力影响 如果阻力为零 则会一直运动 如果希望就算有阻力也让物体一直动就将加力代码放在Update函数里 using UnityEngine; public class Power : MonoBehaviour{ Rigidbody rigidBo…...

LeetCode 面试题 10.05. 稀疏数组搜索

文章目录 一、题目二、C# 题解 一、题目 稀疏数组搜索。有个排好序的字符串数组&#xff0c;其中散布着一些空字符串&#xff0c;编写一种方法&#xff0c;找出给定字符串的位置。 示例1: 输入: words [“at”, “”, “”, “”, “ball”, “”, “”, “car”, “”, “”…...

分类预测 | MATLAB实现基于BiLSTM-AdaBoost双向长短期记忆网络结合AdaBoost多输入分类预测

分类预测 | MATLAB实现基于BiLSTM-AdaBoost双向长短期记忆网络结合AdaBoost多输入分类预测 目录 分类预测 | MATLAB实现基于BiLSTM-AdaBoost双向长短期记忆网络结合AdaBoost多输入分类预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 1.MATLAB实现基于BiLSTM-…...

Sobel算子详解及例程

Sobel算子是一种经典的边缘检测算子&#xff0c;被广泛应用于图像处理领域。它基于图像亮度的变化率来检测边缘的位置&#xff0c;主要通过计算图像中像素点的梯度来实现。 Sobel算子分为水平和垂直两个方向的算子&#xff0c;记作Gx和Gy。它们分别对图像进行水平和垂直方向的…...

ScrapeKit 和 Swift 编写程序

以下是一个使用 ScrapeKit 和 Swift 编写的爬虫程序&#xff0c;用于爬取 图片。同时&#xff0c;我们使用了proxy 这段代码来获取代理。 import ScrapeKit ​ class PeopleImageCrawler: NSObject, ScrapeKit.Crawler {let url: URLlet proxyUrl: URL ​init(url: URL, proxy…...

Java基础面试题知识点总结(上篇)

大家好&#xff0c;我是栗筝i&#xff0c;从 2022 年 10 月份开始&#xff0c;我持续梳理出了全面的 Java 技术栈内容&#xff0c;一方面是对自己学习内容进行整合梳理&#xff0c;另一方面是希望对大家有所帮助&#xff0c;使我们一同进步。得到了很多读者的正面反馈。 而在 2…...

STM32进行LVGL裸机移植

本文的移植参考的是正点原子的课程《手把手教你学LVGL图形界面编程》 基于该课程和《LVGL开发指南_V1.3》“第二章 LVGL 无操作系统移植”&#xff0c;然后结合自身的实际情况进行整理。 先根据自己的习惯&#xff0c;创建基础的单片机工程&#xff0c;然后在APP业务层和DRIVE…...

python解析robot framework的output.xml并生成html

一、用pyh模块解析stat结点数据&#xff08;output.py&#xff09; #codingutf-8import xml.dom.minidom import xml.etree.ElementTree#打开xml文档 dom xml.dom.minidom.parse(./ui/output.xml);root2 xml.etree.ElementTree.parse(./ui/output.xml) #得到文档元素对象 ro…...

【RuoYi移动端】uni-app中的单击和双击事件

1、单击事件&#xff1a; click"enterpriseSelect" 2、双击事件&#xff1a; touchend"userinfo"...

3分钟掌握图像矢量化:从模糊到清晰的魔法转换术

3分钟掌握图像矢量化&#xff1a;从模糊到清晰的魔法转换术 【免费下载链接】vectorizer Potrace based multi-colored raster to vector tracer. Inputs PNG/JPG returns SVG 项目地址: https://gitcode.com/gh_mirrors/ve/vectorizer 你是否曾为网站加载缓慢而烦恼&am…...

RePKG完整指南:简单三步解锁Wallpaper Engine隐藏资源

RePKG完整指南&#xff1a;简单三步解锁Wallpaper Engine隐藏资源 【免费下载链接】repkg Wallpaper engine PKG extractor/TEX to image converter 项目地址: https://gitcode.com/gh_mirrors/re/repkg 你是否曾经被Wallpaper Engine中那些精美的动态壁纸深深吸引&…...

SQL中的键与约束

在SQL这里所说的约束是一种规则&#xff0c;它不是一个具体的代码或者指令。然后我们创建了键&#xff0c;然后给不同的键添加了不同的规则&#xff0c;用来实现约束。 约束的存在主要解决三大问题&#xff0c;确保数据库数据可靠&#xff1a; 防止无效数据&#xff1a;比如禁…...

Wan2.2-I2V-A14B项目实战:从零搭建个人AI艺术画廊网站

Wan2.2-I2V-A14B项目实战&#xff1a;从零搭建个人AI艺术画廊网站 1. 项目概述与价值 想象一下&#xff0c;你可以在自己的网站上展示由AI生成的独特艺术作品&#xff0c;让访客欣赏、点赞甚至参与创作。这正是我们将要实现的个人AI艺术画廊网站。这个项目不仅能让你的创意作…...

Secure boot入门-1基本概念和框架

Secure boot说是为了防止黑客篡改系统&#xff0c;窃取你的数据。但是你的数据一般值得黑客窃取么&#xff0c;我想更重要的原因是商业利益&#xff1a;防止水货和自己偷偷升级不给服务费占据垄断地位&#xff0c;防止黑客二次加工卖钱&#xff0c;防止搞破坏产品不能用。 所以…...

硅基波导介绍

硅基波导的简单介绍 文章目录 一、基本概念 二、原理 2.1 截止频率 2.2 波导的模式 三、硅基波导规格 一、基本概念 波导能够将电磁能量束缚在中空的金属管内传输&#xff0c;从而显著降低传输过程中的损耗&#xff0c;这与天线将能量直接辐射至整个自由空间的工作方式截然不同…...

GLM-ASR-Nano-2512入门必看:如何微调模型适配垂直领域术语(医疗/法律)

GLM-ASR-Nano-2512入门必看&#xff1a;如何微调模型适配垂直领域术语&#xff08;医疗/法律&#xff09; 1. 为什么需要微调语音识别模型 语音识别技术在通用场景下已经相当成熟&#xff0c;但一到专业领域就容易"听不懂话"。想象一下&#xff0c;医生在手术室里说…...

Qwen3-VL-2B-Instruct安全性设置:生产环境部署注意事项

Qwen3-VL-2B-Instruct安全性设置&#xff1a;生产环境部署注意事项 1. 引言&#xff1a;当AI有了“眼睛”&#xff0c;安全就是第一道防线 想象一下&#xff0c;你部署了一个能“看懂”图片的AI助手。它能识别商品、阅读文档、分析图表&#xff0c;甚至能根据一张照片描述场景…...

PyTorch 详解:动态计算图驱动的深度学习框架

文章目录引言&#xff1a;深度学习的“实验室与工厂”一、PyTorch 核心架构总览二、核心组件详解与设计哲学1. 张量&#xff1a;统一的数据基石2. 自动微分与动态计算图&#xff1a;框架的灵魂3. torch.nn 模块&#xff1a;神经网络的高层抽象4. 训练生态系统&#xff1a;优化与…...

赋能智能车与机器人技术转型:大联大世平集团携手AutoSys举办线上研讨会

大联大控股旗下世平集团宣布&#xff0c;于4月1日携手AutoSys&#xff08;先进智能系统&#xff09;成功举办“Edge AI赋能智能车与机器人产业的感知技术转型路径”线上研讨会。 当前&#xff0c;智能车与机器人技术正加速融合&#xff0c;AI大模型深度赋能感知与决策&#xff…...