Spring-同じインタフェースに複数のインスタンスを注入


一般的な開発では、1つのインタフェースが1つの実装クラスに対応していますが、ビジネスシーンでは、1つのインタフェースが複数の実装クラスに対応している場合があります.この場合、@Autowire注入を直接使用するとエラーが発生する可能性があります.次に、一般的な解決方法について説明します.以下のようなサービスインタフェースよりも、複数の実装があります.
//        
public interface IProducerService {}

//  kafak    
@Service("kafkaProducerService")
@Log4j2
public class KafkaProducerService  implements IProducerService {}

//  rabbitmq    
@Service("rabbitProducerService")
@Log4j2
public class RabbitProducerService implements IProducerService {}

//  rocketmq    
@Service("rocketProducerService")
@Log4j2
public class RocketProducerService implements IProducerService {}




次の3つの注入方式により,マルチインタフェースのインスタンス注入を完了することができる.
1@Autowiredを使用する:サービスオブジェクト名はbeanNameと同じにする
    @Autowired
    private IProducerService kafkaProducerService;

    @Autowired
    private IProducerService rocketProducerService;

    @Autowired
    private IProducerService rabbitProducerService;

2@Resourceを使用:注入したnameの名前をサービスのオブジェクト名と一致させる
    @Resource(name = "kafkaProducerService")
    private IProducerService kafkaProducerService;

    @Resource(name = "rocketProducerService")
    private IProducerService rocketProducerService;

    @Resource(name = "rabbitProducerService")
    private IProducerService rabbitProducerService;

3@Autowired+@Qualifierを使用

    @Qualifier(value = "kafkaProducerService")
    @Autowired
    private IProducerService getKafkaProducerService;

    @Qualifier(value = "rocketProducerService")
    @Autowired
    private IProducerService getRocketProducerService;

    @Qualifier(value = "rabbitProducerService")
    @Autowired
    private IProducerService getRabbitProducerService;

次に、条件によるダイナミックマッチングインスタンスの作成方法について説明します.