平常业务中一般都是单实现类,最近研究下了一个接口多实现的用途
1.定一个接口(案例)
public interface PersonService {
void doWork();
1
2
3
2.两个(或多个)实现,具体实现的方法体不同;
@Service("studentService")
public class StudentServiceImpl implements PersonService {
@Override
public void doWork() {
System.err.println(“ studying");
}
}
——————————
@Service("teacherService")
public class TeacherServiceImpl implements PersonService {
@Override
public void doWork() {
System.err.println("teaching");
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
调用接口时@autowire注入
@RunWith(SpringRunner.class)
@SpringBootTest
public class Testff {
@Autowired
private PersonService personService;
}
1
2
3
4
5
6
idea会提示
Could not autowire. There is more than one bean of ‘PersonService’ type.
Beans:
studentService (StudentServiceImpl.java)
teacherService (TeacherServiceImpl.java)
重点来了,有几种方式
一.写死,加上 @Qualifier(“studentService”)就好了,用于指定注入那个实现类
@Autowired
@Qualifier("studentService")
private PersonService personService;
1
2
3
二.通过Map注入,通过spring bean的名称作为key动态获取对应实例;
@Autowired
private Map<String,PersonService> personServiceMap;
@Test
public void testMutiImpl(){
String key="studentService";
//此处的key可以写死在常量类中,或则实时根据策略从数据库中获取;
//通过spring bean的名称作为key获取对应实例;
PersonService personService = personServiceMap.get(key);
personService.doWork();
}
1
2
3
4
5
6
7
8
9
10
11
三. List:spring会自动将PersonService的所有实现类bean注入到list集合
@Autowired
private List<PersonService> services;//所有实现类的bean
@Test
public void testMutiImpl(){
//遍历获取该接口所有的实现类,可以在遍历中加判断获取想要的实现类,
for(PersonService personService :services){
personService.doWork();
}
}
1
2
3
4
5
6
7
8
9
10
11
实际业务应用:根据不同的策略来写实现类,比如不同的鉴权策略,供应商接口调用策略。
---------------------
作者:weixin_42752859
来源:CSDN
原文:https://blog.csdn.net/weixin_42752859/article/details/86745286
版权声明:本文为博主原创文章,转载请附上博文链接!