当前位置: 首页 > 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 …...

2025年能源电力系统与流体力学国际会议 (EPSFD 2025)

2025年能源电力系统与流体力学国际会议&#xff08;EPSFD 2025&#xff09;将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会&#xff0c;EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...

【大模型RAG】Docker 一键部署 Milvus 完整攻略

本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装&#xff1b;只需暴露 19530&#xff08;gRPC&#xff09;与 9091&#xff08;HTTP/WebUI&#xff09;两个端口&#xff0c;即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...

Keil 中设置 STM32 Flash 和 RAM 地址详解

文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

【Go】3、Go语言进阶与依赖管理

前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课&#xff0c;做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程&#xff0c;它的核心机制是 Goroutine 协程、Channel 通道&#xff0c;并基于CSP&#xff08;Communicating Sequential Processes&#xff0…...

linux 下常用变更-8

1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行&#xff0c;YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID&#xff1a; YW3…...

12.找到字符串中所有字母异位词

&#x1f9e0; 题目解析 题目描述&#xff1a; 给定两个字符串 s 和 p&#xff0c;找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义&#xff1a; 若两个字符串包含的字符种类和出现次数完全相同&#xff0c;顺序无所谓&#xff0c;则互为…...

工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配

AI3D视觉的工业赋能者 迁移科技成立于2017年&#xff0c;作为行业领先的3D工业相机及视觉系统供应商&#xff0c;累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成&#xff0c;通过稳定、易用、高回报的AI3D视觉系统&#xff0c;为汽车、新能源、金属制造等行…...

c#开发AI模型对话

AI模型 前面已经介绍了一般AI模型本地部署&#xff0c;直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型&#xff0c;但是目前国内可能使用不多&#xff0c;至少实践例子很少看见。开发训练模型就不介绍了&am…...

【JavaWeb】Docker项目部署

引言 之前学习了Linux操作系统的常见命令&#xff0c;在Linux上安装软件&#xff0c;以及如何在Linux上部署一个单体项目&#xff0c;大多数同学都会有相同的感受&#xff0c;那就是麻烦。 核心体现在三点&#xff1a; 命令太多了&#xff0c;记不住 软件安装包名字复杂&…...

Mobile ALOHA全身模仿学习

一、题目 Mobile ALOHA&#xff1a;通过低成本全身远程操作学习双手移动操作 传统模仿学习&#xff08;Imitation Learning&#xff09;缺点&#xff1a;聚焦与桌面操作&#xff0c;缺乏通用任务所需的移动性和灵活性 本论文优点&#xff1a;&#xff08;1&#xff09;在ALOHA…...