@Autowired注解如何实现自动注入:

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


代码论证:

在一个springboot项目中, 结构如下

@Autowired注解如何实现自动注入:_第1张图片

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类似。

你可能感兴趣的:(java,spring)