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的工作原理
- 依赖扫描与注册:Spring容器启动时,会扫描项目中所有标注了
@Controller、@Service、@Component等注解的类,将它们实例化为Bean并注册到容器中,同时记录每个Bean的依赖关系。 - 依赖匹配与注入:当Spring创建某个Bean实例时,会根据
@Autowired的标记,从容器中查找匹配的依赖Bean:- 构造函数注入:创建Bean时,直接把匹配的依赖作为构造参数传入,完成初始化
- Setter注入:Bean实例化完成后,调用标注了
@Autowired的Setter方法,注入依赖 - 字段注入:通过Java反射机制,直接给标注了
@Autowired的字段赋值
- 匹配规则:默认优先按Bean的类型匹配;如果同类型存在多个Bean,会尝试按Bean的名称匹配;如果还是无法确定唯一Bean,会抛出异常,此时需要用
@Qualifier指定具体Bean的名称。
补充说明
如果你的QuestionController后续新增了其他构造函数,那么必须给需要用来注入依赖的构造函数加上@Autowired,否则Spring无法确定使用哪个构造函数来创建Bean实例,就会出现注入失败的问题。
内容的提问来源于stack exchange,提问作者Abhishek Satyavolu
相关产品推荐
相关产品推荐

