springboot 将实现同一接口的Service注入到Map当中 方法五

本文详细介绍了在Spring框架中如何实现同一接口的多种实现方式,并将这些实现装载为Bean注入到应用程序中。通过示例展示了如何使用@Service、@Resource、@Autowired和@Qualifier注解来区分不同的实现,以及如何通过自定义key和创建Map类型的Bean来管理多个实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

同一接口

public interface SayService {

    public String hello();
}

接口的不同实现

@Service("sayOne")
public class SayServiceOne implements SayService {
    @Override
    public String hello() {
        System.out.println("say one");
        return "say one";
    }
}
@Service("sayTwo")
public class SayServiceTwo implements SayService {
    @Override
    public String hello() {
        System.out.println("say two");
        return "say two";
    }
}

装载到map,作为bean注入到spring中


@Component
public class MapConfig {


     @Bean(name="actServiceMap")
    public Map<String, SayService> getQueryServiceMap(){
        return  new HashMap<>();
        
    }
}

或者自定义key

@Component
public class MapConfig {

    @Resource(name = "sayOne")
    private SayService sayOne;

    @Autowired
    @Qualifier("sayTwo")
    private SayService sayTwo;

    @Bean("sayServiceMap")
    public Map<String, SayService> geneSayServiceMap(){
        Map<String, SayService> sayServiceMap = new HashMap<>();
        sayServiceMap.put("sayOne自定义", sayOne);
        sayServiceMap.put("sayTwo自定义", sayTwo);
        return sayServiceMap;
    }
}

或者这样写也可

@Component
public class ActMap {

    @Bean(name="actServiceMap")
    public Map<String, ActService> geneActServiceMap(@Qualifier("actOne") ActService actOne,
                                                     @Qualifier("actTwo") ActService actTwo){
        Map<String, ActService> map = new HashMap<>();
        map.put("actOne111", actOne);
        map.put("actTwo2222", actTwo);
        return map;
    }
}

测试

@RestController
@RequestMapping("/beanTest")
public class BeanTest {

    @Resource(name="sayServiceMap")
    Map<String, SayService> sayServiceMap;

    @GetMapping("/say")
    public String say(){
        SayService sayOne = sayServiceMap.get("sayOne");
        SayService sayTwo = sayServiceMap.get("sayTwo");

        return sayOne.hello() + "\n" + sayTwo.hello();
    }
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值