springboot注入@autowire——Map/List

论坛 期权论坛 脚本     
匿名网站用户   2020-12-20 09:24   76   0

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

1.定一个接口(案例)

public interface PersonService {
    void   doWork();
}

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. 调用接口时@autowire注入
@RunWith(SpringRunner.class)
@SpringBootTest
public class Testff {
    @Autowired
    private PersonService personService;   
}

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;

二.通过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();
    }

三. List:spring会自动将PersonService的所有实现类bean注入到list集合

 @Autowired
    private List<PersonService> services;//所有实现类的bean

    @Test
    public void  testMutiImpl(){
    //遍历获取该接口所有的实现类,可以在遍历中加判断获取想要的实现类,
        for(PersonService personService :services){
            personService.doWork();
        }
    }

实际业务应用:根据不同的策略来写实现类,比如不同的鉴权策略,供应商接口调用策略。

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:1136255
帖子:227251
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP