You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot中@Autowired注解的作用及无注解仍可用的原因

Spring Boot中@Autowired注解的作用、工作原理,以及移除后仍能运行的原因

为什么你的代码移除@Autowired还能正常工作?

从Spring 4.3版本开始,如果一个Spring管理的Bean(比如你的QuestionController,因为加了@RestController被Spring识别为Bean)只有一个构造函数,Spring会自动通过这个构造函数完成依赖注入,不需要显式添加@Autowired注解。你的QuestionController正好符合这个场景,所以去掉注解后API依然能正常调用。


@Autowired的核心作用

  • 明确告知Spring容器:当前Bean需要注入指定的依赖对象
  • 支持三种依赖注入方式:
    • 构造函数注入(Spring官方推荐的方式,你的代码用的就是这种)
    • Setter方法注入
    • 字段直接注入(不推荐,不利于单元测试和代码维护)
  • 配合@Qualifier注解,可以在同类型存在多个Bean时,精准指定要注入的目标Bean

@Autowired的工作原理

  1. 依赖扫描与注册:Spring容器启动时,会扫描项目中所有标注了@Controller、@Service、@Component等注解的类,将它们实例化为Bean并注册到容器中,同时记录每个Bean的依赖关系。
  2. 依赖匹配与注入:当Spring创建某个Bean实例时,会根据@Autowired的标记,从容器中查找匹配的依赖Bean:
    • 构造函数注入:创建Bean时,直接把匹配的依赖作为构造参数传入,完成初始化
    • Setter注入:Bean实例化完成后,调用标注了@Autowired的Setter方法,注入依赖
    • 字段注入:通过Java反射机制,直接给标注了@Autowired的字段赋值
  3. 匹配规则:默认优先按Bean的类型匹配;如果同类型存在多个Bean,会尝试按Bean的名称匹配;如果还是无法确定唯一Bean,会抛出异常,此时需要用@Qualifier指定具体Bean的名称。

补充说明

如果你的QuestionController后续新增了其他构造函数,那么必须给需要用来注入依赖的构造函数加上@Autowired,否则Spring无法确定使用哪个构造函数来创建Bean实例,就会出现注入失败的问题。

内容的提问来源于stack exchange,提问作者Abhishek Satyavolu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 12:31:06