结论:@Autowired注解按照类型去IOC容器中查找bean对象,如果容器(即为IOC容器)中没有该类型对象(例如,该类型是个接口),则去容器中查找该类型的子类(实现类)的对象,进行注入。
代码论证:
在一个springboot项目中, 结构如下

HelloController类代码:
@RestController
@RequestMapping("/hello")
public class HelloController {
@Autowired
private HelloService helloService;
@RequestMapping(value = "test",method = RequestMethod.GET)
public String test(){
System.out.println(helloService.getClass());
return "hello test";
}
}
HelloService类代码:
public interface HelloService {
}
HelloService1Impl类代码:
@Service
public class HelloService1Impl implements HelloService {
}
HelloService2Impl类代码:
//@Service
public class HelloService2Impl implements HelloService {
}
过程:
1.当HelloService接口没有实现类或者实现类都没加入容器(类上加@Service注解)时,代码报错;此时容器中没有该类型的对象,或者没有其实现类对象。
2.当HelloService接口有实现类并且只有一个实现类加入容器(类上加@Service注解)时,代码可以正常运行;此时容器中有且只有一个该类型实现类对象。
3.当HelloService接口有实现类并且有多个(至少两个)实现类加入容器(类上加@Service注解)时,代码报错;此时容器中有多个该类型实现类对象,容器无法分别将哪个实现类对象注入。
4.当HelloService为Java类时,如果在HelloService类加@Service注解,其子类也加上该注解,则不会报错,注入的是HelloService类的对象,其他情况与过程1、2、3类似。
本文探讨了@Autowired注解在SpringBoot项目中的工作方式。它按照类型从IOC容器中查找并注入bean对象。通过示例代码展示了不同场景下@Autowired的行为表现,包括报错情况和成功注入的情况。
488

被折叠的 条评论
为什么被折叠?



