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

spring中手写注解开发(创建对象篇)

说明:

        在spring底层中并不是我写的如此,这篇只是我用我自己的方式实现了使用注解组件扫描并且

        创建对象,方法并不是很难,可以看一看,欢迎大佬评论


第一步:

        我们需要自己写一个注解,我用的是idea直接创建一个注解即可

//该注解说明它可以出现的范围value值为数组类型
//在使用注解时如果他的属性名是value时value可以省略
//如果属性值是数组类型且只有一个元素时大括号也可以省略
@Target(
value={ElementType.TYPE,ElementType.FIELD}
)@Rentation(RentationPolicy.RUNTIME)
public @interface Component{
//String是属性类型,一个是属性名String value() default "";
}

 写这个注解就是以后扫描到这个注解就创建对象


第二步:

创建三个类用于测试

@Component("A")
public class A{public A(){System.out.println("A类被创建了");}
}
@Component("B")
public class B{public B(){System.out.println("B类被创建了");}
}
@Component("C")
public class C{public C(){System.out.println("A类被创建了");}
}

 

第三步:

现在来编写需要运行的类

public class test{
public static void main(String[] args){//先创建一个map集合先将扫描到的对象暴漏(创建)放在map集合中Map<String,Object> beanMap = new HashMap<String,Object>//给一个路径,这里给的是类的根路径下的包,具体路径看你自己类的位置String path = "com.mySpring.Annotation";//将路径里面的.换成/,在正则表达式里面.表示所有,所以不能直接写.//\.表达的是点,要转义所以用\\.表示String realPath = path.replaceAll("\\.","/");//获取你要扫描文件的绝对路径,这里返回url对象URL url = ClassLoader.getSystemClassLoader().getResource(realPath);String allPath = url.getPath();//获取绝对路径下的所有文件File file = new File(allPath);File[] files = file.listFiles();//循环遍历文件Arrays.stream(files).forEach(f -> {try{//获取类路径,使用反射创建对象String className = path+"."+f.getName().split("\\.")[0];Class<?> aClass = Class.forname("className");//判断类上是否有注解if(aClass.isAnnotationPresent(Component.class)){//获取Component组件对象Component component = aClass.getAnnotation(Component.class);//获取id也就是value值String id = component.value();//获取当前对象Object obj = aClass.newInstance();//添加到map集合中beanMap.put(id,obj);}}catch(Exception e){e.printStackTrace();}});//最终查看一下map集合System.out.println(beanMap);}}

第四步:

运行结果如图

注:

        在这里并没有写xml文件这一步,只是模拟,开局就已经给了path包的路径

相关文章:

spring中手写注解开发(创建对象篇)

说明&#xff1a; 在spring底层中并不是我写的如此&#xff0c;这篇只是我用我自己的方式实现了使用注解组件扫描并且 创建对象&#xff0c;方法并不是很难&#xff0c;可以看一看&#xff0c;欢迎大佬评论 第一步&#xff1a; 我们需要自己写一个注解&#xff0c;我用的是idea…...

Android OpenGLES2.0开发(十一):渲染YUV

人生如逆旅&#xff0c;我亦是行人 Android OpenGLES开发&#xff1a;EGL环境搭建Android OpenGLES2.0开发&#xff08;一&#xff09;&#xff1a;艰难的开始Android OpenGLES2.0开发&#xff08;二&#xff09;&#xff1a;环境搭建Android OpenGLES2.0开发&#xff08;三&am…...

在linux中利用conda安装blast

在 Linux 中使用 conda 安装 BLAST 非常简单。conda 是一个流行的包管理工具&#xff0c;可以轻松安装和管理生物信息学工具&#xff0c;包括 BLAST。以下是具体步骤&#xff1a; 1. 确保已安装 Conda 如果你还没有安装 conda&#xff0c;可以参考以下步骤安装 Miniconda&…...

三、多项式环

文章目录 一、多项式环的定义二、多项式环的性质1. 多项式加法2. 多项式乘法3. 满足的运算规律4. 次数5. 单位元 三、剩余多项式环&#xff08;商多项式环&#xff09;四、有限多项式环五、多项式环的性质与特性1. 子环与理想2. 不可约性和素性3. 有限生成性 一、多项式环的定义…...

python unzip file

要在 Python 中解压文件并显示进度&#xff0c;我们需要在解压过程中跟踪文件的提取进度。由于 zipfile 模块本身不直接支持进度显示&#xff0c;我们可以通过手动计算并使用 tqdm 库来显示进度条。 安装 tqdm 首先&#xff0c;确保你已经安装了 tqdm 库&#xff0c;用于显示…...

MySQL-增删改查

一、Create(创建) &#x1f4d6; 语法&#xff1a; INSERT INTO table_name(value_list); 当我们使用表的时候&#xff0c;就可以使用这个语法来向表中插入元素~ 我们这边创建一个用于示范的表(Student)~ create table student( id int, name varchar(20), chinese int, math…...

LeetCode 热题100 15. 三数之和

LeetCode 热题100 | 15. 三数之和 大家好&#xff0c;今天我们来解决一道经典的算法题——三数之和。这道题在 LeetCode 上被标记为中等难度&#xff0c;要求我们从一个整数数组中找到所有不重复的三元组&#xff0c;使得三元组的和为 0。下面我将详细讲解解题思路&#xff0c…...

网络空间安全(1)web应用程序的发展历程

前言 Web应用程序的发展历程是一部技术创新与社会变革交织的长卷&#xff0c;从简单的文档共享系统到如今复杂、交互式、数据驱动的平台&#xff0c;经历了多个重要阶段。 一、起源与初期发展&#xff08;1989-1995年&#xff09; Web的诞生&#xff1a; 1989年&#xff0c;欧洲…...

ABAQUS功能梯度材料FGM模型

功能梯度材料&#xff08;FGM&#xff09;作为一种新型复合材料&#xff0c;通过材料内部成分或微观结构的梯度变化&#xff0c;优化特定性能适应复杂环境&#xff0c;被广泛应用于高温防护、结构优化、生物医学、光电设备等领域。本案例介绍在ABAQUS内建立功能梯度材料模型。 …...

自适应增强技术

1. 传统图像处理中的自适应增强&#xff08;如CLAHE&#xff09; 难度&#xff1a;⭐容易 实现方式&#xff1a;调用成熟的库&#xff08;如OpenCV&#xff09;函数即可完成。 示例代码&#xff08;CLAHE增强&#xff09;&#xff1a; <PYTHON> import cv2# 输入灰度或彩…...

虚拟项目:一个好用的工具平台

在当今数字化的时代&#xff0c;虚拟项目如雨后春笋般涌现&#xff0c;为人们提供了诸多便捷且充满机遇的选择。以下将为大家详细介绍几种颇具特色的虚拟项目&#xff0c;包括书签、资源站、题库、虚拟商城、专栏、证件照以及分站搭建等&#xff0c;一起来了解它们各自的独特之…...

MySQL 和 Elasticsearch 之间的数据同步

MySQL 和 Elasticsearch 之间的数据同步是常见的需求&#xff0c;通常用于将结构化数据从关系型数据库同步到 Elasticsearch 以实现高效的全文搜索、聚合分析和实时查询。以下是几种常用的同步方案及其实现方法&#xff1a; 1. 应用层双写&#xff08;双写模式&#xff09; 原…...

PS裁剪工具

裁剪&#xff1a; 多张图同一标准裁剪&#xff1a;裁剪–》前面的图像–》选择其他图像–》 确定 选区–》裁剪工具–》确定&#xff1a;选区制作矩形裁剪 裁剪–》拉直 裁剪–》内容识别&#xff1a;当裁剪大于图片大小&#xff0c;会自动填充空白区域 &#xff08;栅格化图层…...

[Web 安全] PHP 反序列化漏洞 —— PHP 序列化 反序列化

关注这个专栏的其他相关笔记&#xff1a;[Web 安全] 反序列化漏洞 - 学习笔记-CSDN博客 0x01&#xff1a;PHP 序列化 — Serialize 序列化就是将对象的状态信息转化为可以存储或传输的形式的过程&#xff0c;在 PHP 中&#xff0c;通常使用 serialize() 函数来完成序列化的操作…...

QT入门--QMainWindow

从上向下依次是菜单栏&#xff0c;工具栏&#xff0c;铆接部件&#xff08;浮动窗口&#xff09;&#xff0c;状态栏&#xff0c;中心部件 菜单栏 创建菜单栏 QMenuBar* mybar1 menuBar(); 将菜单栏放到窗口中 setMenuBar(mybar1); 创建菜单 QMenu *myfilemenu mybar1-…...

C++ | 高级教程 | 信号处理

&#x1f47b; 概念 信号 —— 操作系统传给进程的中断&#xff0c;会提早终止程序有些信号不能被程序捕获&#xff0c;有些则可以被捕获&#xff0c;并基于信号采取适当的动作 信号描述SIGABRT程序的异常终止&#xff0c;如调用 abortSIGFPE错误的算术运算&#xff0c;比如除…...

最新前端框架选型对比与建议(React/Vue/Svelte/Angular)

前端框架选型对比与建议&#xff08;React/Vue/Svelte/Angular&#xff09; 一、核心框架技术特性对比&#xff08;基于最新版本&#xff09; 维度React 19 25Vue 3.5 12Svelte 5 25Angular 19 5核心理念函数式编程、JSX语法、虚拟DOM渐进式框架、组合式API、模板语法编译时框…...

游戏引擎学习第123天

仓库:https://gitee.com/mrxiao_com/2d_game_3 黑板&#xff1a;线程同步/通信 目标是从零开始编写一个完整的游戏。我们不使用引擎&#xff0c;也不依赖任何库&#xff0c;完全自己编写游戏所需的所有代码。我们做这个节目不仅是为了教育目的&#xff0c;同时也是因为编程本…...

计算机网络:从底层原理到前沿应用,解锁数字世界的连接密码

计算机网络&#xff1a;从底层原理到前沿应用&#xff0c;解锁数字世界的连接密码 在信息如洪流般奔涌的时代&#xff0c;计算机网络宛如无形的脉络&#xff0c;贯穿于我们生活的每一个角落。它不仅是数据传输的通道&#xff0c;更是连接全球、驱动创新的核心力量。从日常的网络…...

grafana K6压测

文章目录 install and runscript.jsoptions最佳实践 report 解析 https://grafana.com/docs/k6/latest/get-started install and run install # mac brew install k6当前目录下生成压测脚本 # create file script.js k6 new [filename] # create file ‘script.js’ in …...

新手必看!SGLang结构化生成语言入门指南,从安装到第一个案例

新手必看&#xff01;SGLang结构化生成语言入门指南&#xff0c;从安装到第一个案例 1. SGLang是什么&#xff1f; SGLang全称Structured Generation Language&#xff08;结构化生成语言&#xff09;&#xff0c;是一个专门为大语言模型设计的推理框架。它主要解决两个核心问…...

企业级京东自动评价系统架构设计:深度解析高可用解决方案

企业级京东自动评价系统架构设计&#xff1a;深度解析高可用解决方案 【免费下载链接】jd_AutoComment 自动评价,仅供交流学习之用 项目地址: https://gitcode.com/gh_mirrors/jd/jd_AutoComment 在电商平台自动化运营领域&#xff0c;京东自动评价系统面临着多重技术挑…...

联邦学习中的隐私保护与模型聚合优化方案

联邦学习作为一种分布式机器学习范式&#xff0c;能够在保护数据隐私的前提下实现多方协作建模&#xff0c;近年来受到广泛关注。其核心思想是参与方在本地训练模型&#xff0c;仅上传模型参数而非原始数据&#xff0c;通过中央服务器聚合更新全局模型。这一过程中仍面临隐私泄…...

【技术综述】世界模型演进图谱:从Dyna到Sora,理解与预测的双重变奏

1. 世界模型的起源与核心使命 1989年&#xff0c;强化学习先驱Richard Sutton在论文中首次提出Dyna架构时&#xff0c;可能没想到这个概念会成为人工智能理解世界的基石。当时他正在思考一个简单却深刻的问题&#xff1a;智能体如何像人类一样&#xff0c;通过想象来规划行动&…...

mysql5.7的rownumber写法

db2中的语句select * from ( select rownumber() over (order by a.stdcno) as num , a.id ,b.cuno from t1 a ,t2 b where a.id b.id ) as Amysql5.7中的语句select cast(row_num : row_num 1 as char) AS num , A.* from (select row_num :0) r,( select a.id, b.cuno fro…...

蓝牙耳机连接背后的秘密:SDP协议在A2DP配对中的关键作用

蓝牙耳机连接背后的秘密&#xff1a;SDP协议在A2DP配对中的关键作用 每次打开蓝牙耳机&#xff0c;手机总能自动识别并恢复上次的音量设置和播放控制——这种无缝体验背后&#xff0c;隐藏着一套精妙的协议对话机制。就像餐厅老顾客无需重复点单&#xff0c;蓝牙设备间的"…...

Keil环境下ST-LINK调试实战指南与常见问题解析

1. ST-LINK调试环境搭建 第一次用ST-LINK调试STM32时&#xff0c;我花了整整一个下午才搞定环境配置。现在回想起来&#xff0c;其实只要注意几个关键点就能避免很多坑。先说说硬件连接&#xff0c;ST-LINK和开发板的接线看似简单&#xff0c;但接错线的情况太常见了。VCC、GND…...

PowerBI进阶技巧:利用SVG打造动态数据标签与进度条

1. 为什么需要SVG动态数据标签与进度条 在PowerBI报表设计中&#xff0c;表格是最常用的数据展示形式之一。但传统表格有个致命问题&#xff1a;当数据量较大时&#xff0c;关键信息容易被淹没在海量数据中。想象一下&#xff0c;你给领导展示的销售报表有20列数据&#xff0c;…...

告别迷茫!用VSCode+Linux-4.9.88内核,手把手教你给IMX6ULL写第一个字符驱动

从零构建IMX6ULL字符驱动&#xff1a;VSCode环境下的高效开发实战 嵌入式Linux驱动开发常被视为高门槛领域&#xff0c;但合理利用现代工具链能显著降低学习曲线。本文将基于IMX6ULL开发板和Linux-4.9.88内核&#xff0c;演示如何通过VSCode搭建高效的驱动开发环境&#xff0c;…...

配置 PyCharm(汉化版操作指南)

本文详细介绍了PyCharm汉化版配置Python 3.13.13环境的完整步骤。首先通过"文件→设置→Python解释器"路径进入配置界面&#xff0c;选择"添加本地解释器"并创建Virtualenv虚拟环境&#xff0c;指定Python3.13.13安装路径中的python.exe作为基础解释器。重…...