spring boot 本身不是轻量级容器,其精简版是剥离自动配置等冗余层后仅保留注解扫描、bean管理与依赖注入的极简ioc容器,核心仅需@component、@autowired、@qualifier三个注解,通过原生java反射与包扫描实现手动实例化与注入,jar包可压缩至100kb内。

Spring Boot 本身不是轻量级容器,它是基于 Spring Framework 的封装,启动开销和依赖体积天然偏大。所谓“基于注解的轻量级依赖注入容器精简版”,本质是剥离 Spring Boot 全套自动配置、Web 容器、Actuator、Starter 机制等冗余层,只保留最核心的注解扫描 + Bean 管理 + 依赖注入能力——也就是一个极简 IOC 容器,200 行左右就能跑通。
核心注解只需三个
不需要全量 Spring 注解生态,只要实现以下最小集合即可支撑基础注入:
- @Component:标记可被扫描并实例化的类(相当于 Spring 的 @Component / @Service / @Repository 统一简化)
- @Autowired:标记字段或构造器,表示此处需要容器注入依赖
- @Qualifier(可选但实用):当同一接口有多个实现时,指定注入哪个具体类型
手动扫描 + 实例化 + 注入三步走
不依赖 Spring 的 ClassPathBeanDefinitionScanner 或 ApplicationContextRefresh 流程,用原生 Java 反射+包扫描完成:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 用 ClassLoader + URL + 文件遍历 扫描指定包路径下所有 class 文件
- 用 Class.forName() + isAnnotationPresent(Component.class) 筛出候选类
- 调用 clazz.getDeclaredConstructor().newInstance() 创建实例,并缓存到 ConcurrentHashMap
中(key 是类名或简单名) - 对每个实例,遍历其字段,若字段上有 @Autowired,就从缓存中按类型查出对应 bean 并 setAccessible(true) 后赋值
构造器注入比字段注入更可控
字段注入(@Autowired 在属性上)虽写法简洁,但需反射绕过访问控制,且无法保证依赖非空;构造器注入更符合不可变性原则,也更容易在手写容器中统一处理:
- 扫描时检查类是否有 public 构造器,优先取参数最多的那个
- 解析每个参数类型,在已注册 bean 缓存中按 type 查找匹配实例
- 递归处理依赖链(A 依赖 B,B 依赖 C),需加简单循环检测避免栈溢出
- 构造成功后立即 put 到 beans map,后续其他 bean 可直接引用
不用 Spring Boot,也能用 Spring 注解风格
你完全可以用自己的 AnnotationConfigApplicationContext 替代 Spring 的——它只是一个普通 Java 类,负责加载配置类、触发扫描、执行注入逻辑。关键不在于名字,而在于行为:
- 定义一个 MyApplicationContext 类,构造时传入 basePackage
- 内部调用 scanAndRegister() → instantiateBeans() → injectDependencies()
- 提供 getBean(Class
) 和 getBean(String) 方法,对外暴露使用入口 - 所有逻辑不依赖 spring-context.jar,只用 JDK 原生 API,jar 包体积可压到 100KB 内










