springboot注入@autowire——Map/List

平常业务中一般都是单实现类,最近研究下了一个接口多实现的用途

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 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 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 
版权声明:本文为博主原创文章,转载请附上博文链接!

你可能感兴趣的:(架构设计)