怎么在初学者练手项目中利用并发Map配合文件注解模拟依赖注入框架

秋萱君_1030

秋萱君_1030

2026-06-03

227人浏览

原创

初学者可用concurrenthashmap配合@mycomponent和@myautowired注解模拟di:先扫描包中带@mycomponent的类,反射创建实例并以小驼峰名存入map;再遍历已注册bean,对含@myautowired的字段,按类型或名称查map并注入,全程线程安全、日志清晰、逻辑分两轮。

怎么在初学者练手项目中利用并发map配合文件注解模拟依赖注入框架

初学者练手项目中,用 ConcurrentHashMap 配合自定义注解模拟依赖注入(DI),核心在于“轻量、可运行、逻辑清晰”——不追求功能完整,而重在理解容器管理、反射注入、线程安全这几个关键环节。下面直接说怎么做,不绕弯。

定义两个基础注解:@MyComponent 和 @MyAutowired

这是整个模拟的起点,就像贴标签一样告诉框架“这个类归我管”“这个字段要填东西”。

  • @MyComponent:标注在类上,表示该类需要被容器创建并托管;用 @Retention(RetentionPolicy.RUNTIME) 确保运行时能读到
  • @MyAutowired:标注在字段上,表示该字段需要自动注入一个已注册的 Bean;同样保留到运行时

用 ConcurrentHashMap 当 Bean 容器

不用 synchronized 或 Hashtable,就用 ConcurrentHashMap<string object></string> 存 Bean 实例,key 是 bean 名(比如类名首字母小写),value 是实例对象。

ShareGPT
ShareGPT

一款AI开发辅助工具,主要用于ShareGPT是一个Chrome扩展,可以让你一键分享你的ChatGPT对话,适合需要提升相关任务效率的用户。

下载
  • 选它是因为:多线程下 put/get 安全,初学者不用自己加锁,也避免 HashMap 在并发场景下扩容出问题
  • 初始化时扫描指定包路径下的所有 class,遇到带 @MyComponent 的类,就用反射创建实例,放进 map
  • bean 名建议统一规则,例如 clazz.getSimpleName().substring(0,1).toLowerCase() + clazz.getSimpleName().substring(1)

扫描 + 注入:两步走,用反射完成

整个流程分两轮:第一轮创建所有单例 Bean 并注册;第二轮遍历这些 Bean,对其中带 @MyAutowired 的字段,从 map 中查对应类型或名称的 Bean,再用 Field.setAccessible(true) 注入进去。

  • 扫描包路径可用 ClassLoader.getResource() 获取 class 文件路径,再递归解析 .class 文件(简单起见,也可用 Files.walk() 扫 jar 或 classes 目录)
  • 字段注入时注意:如果字段类型是接口,就按接口类型找所有实现类中已注册的实例;若没找到,跳过或抛提示(别让初学者卡在空指针)
  • 为防循环依赖,可加个正在创建中的集合(如 Set<class>></class>),发现重复进入就报错提示

写个启动类验证效果

新建几个测试类,比如 UserService 依赖 UserDao,都打上 @MyComponent;UserDao 字段在 UserService 里用 @MyAutowired 标记。然后手动调用你的容器初始化方法,最后 getBean("userService") 并调用方法看是否成功执行。

  • 不需要 XML 或配置类,全部靠注解驱动
  • 打印日志说明每一步在做什么(如“注册 UserDao → 实例已存入容器”“注入 UserService.userDao 字段”),方便调试
  • 哪怕只支持字段注入、不支持构造器或 setter,也完全够练手理解 DI 本质

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2023.06.15

10017

6

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

2023.07.05

7162

9

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

2023.07.31

6292

8

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.01

1084

3

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.02

908

3

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

1316

5

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

2629

5

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

2023.08.03

19951

3

配置java环境变量
配置java环境变量

配置Java环境变量是为了让操作系统能够识别和使用Java的相关命令和功能。本专题为大家提供配置java环境变量相关文章,帮助大家解决问题。

2023.08.03

1175

8

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Swoft2.x速学之http api篇课程
Swoft2.x速学之http api篇课程

共16课时 | 1.5万人学习

Django DRF 源码解析
Django DRF 源码解析

共21课时 | 2万人学习

Golang进阶实战编程
Golang进阶实战编程

共34课时 | 3.9万人学习