可用轻量级伪di容器模拟依赖注入:用@component标记类,concurrenthashmap存实例,反射扫描包并注入@autowired字段,支持by-type注入和单例管理。

可以用一个轻量级的“伪DI容器”来模拟依赖注入的核心逻辑,不引入Spring等框架,只靠 Map 存储对象 + 自定义注解 + 反射扫描,非常适合初学者理解DI本质。
1. 定义自己的 @Component 注解
先写一个标记类的注解,让容器知道哪些类需要被管理:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Component {
String value() default ""; // 可选的bean名称
}
这个注解加在类上,比如 @Component 的 UserService、OrderDao,就表示它们是待托管的组件。
2. 用 Map 模拟 IOC 容器
核心就是用 ConcurrentHashMap<string object></string> 当作单例池:
一款AI音频处理工具,主要用于通过向 `toingg/make_campaign` API 发送 POST 请求,提交用户提供的 JSON 数据,创建并启动 Toingg 语音呼叫活动,适用于 Codex 将活动简报……,适合需要提升相关任务效率的用户。
- key 是 bean 名称(类名首字母小写,或
@Component("xxx")指定的值) - value 是通过反射 new 出来的实例
- 初始化时扫描指定包路径下的所有
@Component类,逐一实例化并存入 Map
3. 支持 @Autowired 字段注入
在创建每个 bean 实例后,遍历其所有 private 字段,检查是否标注了 @Autowired:
- 若字段类型在 Map 中有对应实例(按类型匹配),就用反射设值
- 支持 by-type(默认),也可扩展 by-name(读取字段名或
@Autowired(value="xxx")) - 注意:要处理循环依赖——初学者项目可先禁止循环依赖,抛异常提示
4. 简单使用示例
假设你有:
@Component
public class UserDao { }
@Component
public class UserService {
@Autowired
private UserDao userDao; // 容器自动注入
}
启动时调用 MyContainer.init("com.example.service"),它会:
- 扫描包,发现
UserDao和UserService - 先创建
UserDao实例放入 Map(key="userDao") - 再创建
UserService,发现字段userDao需注入,从 Map 找到对应实例并 set - 最后可通过
MyContainer.getBean(UserService.class)获取已装配好的对象
不复杂但容易忽略细节:记得设置 field.setAccessible(true) 绕过 private 限制,且整个过程建议用静态块或单例模式封装容器实例。










