Spring 中 IService 有多个实现类,它是如何知道该注入哪个 ServiceImpl 类?

73 阅读2分钟

注意:不能有同名的,不然要报错。

@Autowired注解的意思就是:

当Spring发现**@Autowired**注解时,将自动在代码上下文中找到和其匹配(默认是类型匹配)的Bean,并自动注入到相应的地方去。

@Resource的作用相当于@Autowired

@Autowired和@Resource两个注解的区别:

1、**@Autowired是Spring的注解,@Resource**是J2EE的注解,这个看一下导入注解的时候这两个注解的包名就一清二楚了。

2、**@Autowired默认按照byType方式进行bean匹配,@Resource**默认按照byName方式进行bean匹配。

3、@Autowired默认情况下必须要求依赖对象必须存在,如果要允许null值,可以设置它的required属性为false,如:@Autowired(required=false)

方法一代码如下:

接口

public interface HumanService {

public String name();

}

接口实现类

@Servicepublic class TeacherServiceImpl implements HumanService {

@Override

public String name() {

System.out.println("teacher");

return "teacher";

}

}

@Servicepublic class DoctorServiceImpl implements HumanService {

@Override

public String name() {

System.out.println("doctor");

return "doctor";

}

}

控制器

@RestController

public class HumanController {

//    @Resource(type = DoctorServiceImpl.class) //方法二

@Autowired

@Qualifier("teacherServiceImpl")

private HumanService humanService;

@RequestMapping("/name")

public String name(){

return humanService.name();

}

}

方法三代码如下:

接口

public interface HumanService {

public String name();

}

接口实现类

@Service("teacherService")

public class TeacherServiceImpl implements HumanService {

@Override

public String name() {

System.out.println("teacher");

return "teacher";

}

}

@Service("doctorService")

public class DoctorServiceImpl implements HumanService {

@Override

public String name() {

System.out.println("doctor");

return "doctor";

}

}

控制器

@RestController

public class HumanController {

@Resource(name="doctorService")

private HumanService humanService;

@RequestMapping("/name")

public String name(){

return humanService.name();

}

}

作者:zoe_java

cnblogs.com/zoe-java/p/11530888.html

往期精选  点击标题可跳转

突然慌了!面试官问:线程池中多余的线程是如何回收的?

MySQL 数据库中百万级数据量,大神是如何分页查询?

数据库中 SQL 语句使用索引,还是很慢?可能是这几点原因

Spring Boot 框架中实现跨域访问的五种解决方案,你懂了吗?

面试官问:导致 Spring 事务失效的场景有哪些,如何解决失效问题?