依赖注入是Spring Boot核心机制,需掌握IoC容器与Bean概念,优先使用构造函数注入(支持final、可测、不可空),慎用字段注入,结合setter注入解决特定场景问题,并通过日志、断点、异常验证注入有效性。

依赖注入是 Spring Boot 的核心机制,不是“用不用”的问题,而是“怎么用对、用稳、用清楚”的问题。学得扎实,代码才不容易出 NullPointerException,单元测试才好写,模块之间才真正解耦。
先搞懂 IoC 容器和 Bean 是什么
依赖注入的前提,是 Spring 容器在管理对象(即 Bean)。不理解这点,就容易把 @Autowired 当成“魔法注解”乱加。
- IoC 容器就像一个“管家”,负责创建对象、维护对象生命周期、处理对象之间的关系
- 被 @Component、@Service、@Controller、@Repository 标记的类,会被自动注册为 Bean,放进容器里
- 你写的 Controller 或 Service 要用到另一个类(比如 UserRepository),容器会主动把那个 Bean “送过来”,而不是你自己 new 出来
从构造函数注入开始练,别碰字段注入
官方明确不推荐直接在字段上加 @Autowired(IDE 会标黄警告),因为破坏封装、难测试、无法保证不可变性。构造函数注入是首选,也是 Spring Boot 3.x 默认鼓励的方式。
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
- 把依赖声明为 final 字段,只在构造函数里赋值
- 如果只有一个构造函数,@Autowired 可省略(Spring 自动识别)
- 多个构造函数时,必须显式标注 @Autowired,否则 Spring 不知道选哪个
- 好处:依赖一创建就到位、不可为空、天然支持单元测试(可手动传参构造实例)
掌握三种注入方式的适用场景
虽然构造函数是主力,但 setter 和字段注入在特定场景仍有价值,关键是知道为什么用、什么时候用。
- 构造函数注入:绝大多数业务类(Service、Repository、Config)都该用它,尤其是依赖稳定、不可变的场景
- Setter 注入:适合可选依赖、后期动态替换(如不同策略实现)、或存在循环依赖且无法重构时(但应优先考虑拆分逻辑)
- 字段注入(慎用):仅限极少数框架集成场景(如某些测试工具、Lombok + @Lazy 的组合),日常开发中避免
动手验证每一步,别只看代码
光抄示例没用,要自己改、自己断点、自己观察启动日志。
- 启动项目时留意控制台输出:看到 “Started XXX in X seconds” 前,Spring 会打印加载了哪些 Bean,可以确认你的类是否进容器
- 在构造函数里加 System.out.println,验证注入时机(早于任何 @PostConstruct)
- 故意删掉某个 @Service 类上的注解,看启动是否报错 —— 这说明依赖确实被容器管理着
- 用 @Primary 或 @Qualifier 区分同类型多个 Bean,解决“Bean not unique”异常










