最近在看面试题和复习框架,在看到springboot的时候,想查一下@Autowired和@Resource注解的区别,结果查出来各式各样的,最后自己基于Springboot 2.4.3去实践了一下。
先说结论:
@Autowired只能通过type去容器查找
而@Resource支持用name,type两种方式查找,默认使用name
下面是实践:
如果在容器里出现多个相同type的对象,也会抛出异常,expected single matching bean but found x
@Autowired默认根据type去容器查找,如果容器内没有该类型对象,会抛异常。如果容器内有该对象,则注入成功
说明@Autowired注解只能通过类型注入,跟name并无关系,当容器中出现多个相同类型对象时,会抛出异常,此时需要结合@Qualifier去找具体名称的容器对象才行
而@Resource默认根据name去容器查找,如果根据name查找不到,会通过type进行查找,但是如果查出有多个相同类型对象时,此时会抛出异常,expected single matching bean but found x
通过更改变量类型和名字,会发现都能注入成功
说明@Resource支持用name和type两种方式,默认通过name进行查找,通过name查不到时,会通过type进行查找