如何在Micronaut中注入同一接口的不同实现类
嘿,这个问题我刚好处理过,Micronaut里注入同一个接口的多个实现其实很 straightforward,完全能满足你想要的注入方式。下面一步步来实现:
实现步骤
1. 创建自定义限定符注解
首先你需要定义@MotoDao和@CarDao这两个限定符注解,用来标记不同的实现类。Micronaut支持用@Qualifier元注解来创建自定义限定符:
import jakarta.inject.Qualifier; import java.lang.annotation.Retention; import java.lang.annotation.Target; import static java.lang.annotation.ElementType.*; import static java.lang.annotation.RetentionPolicy.RUNTIME; @Qualifier @Target({TYPE, METHOD, PARAMETER, FIELD}) @Retention(RUNTIME) public @interface MotoDao { }
同样的方式创建@CarDao注解:
import jakarta.inject.Qualifier; import java.lang.annotation.Retention; import java.lang.annotation.Target; import static java.lang.annotation.ElementType.*; import static java.lang.annotation.RetentionPolicy.RUNTIME; @Qualifier @Target({TYPE, METHOD, PARAMETER, FIELD}) @Retention(RUNTIME) public @interface CarDao { }
2. 在实现类上添加限定符注解
接下来,给你的MotoDao和CarDao实现类分别加上对应的限定符注解,同时别忘了添加@Singleton让Micronaut容器管理这些Bean:
@MotoDao @Singleton public class MotoDaoImpl implements VehicleDao { // 实现VehicleDao接口的方法 }
@CarDao @Singleton public class CarDaoImpl implements VehicleDao { // 实现VehicleDao接口的方法 }
3. 在VehicleHandler中注入多个实现
现在就可以完全按照你期望的方式,在构造函数中注入这两个实现了:
@Singleton public class VehicleHandler { private final VehicleDao motoDao; private final VehicleDao carDao; @Inject public VehicleHandler(@MotoDao VehicleDao motoDao, @CarDao VehicleDao carDao) { this.motoDao = motoDao; this.carDao = carDao; } // 业务方法中可以分别调用两个Dao的逻辑 public void processMotoData() { motoDao.someVehicleMethod(); } public void processCarData() { carDao.someVehicleMethod(); } }
补充:快捷替代方案(用@Named)
如果你不想自定义注解,也可以用Micronaut自带的@Named限定符简化操作:
- 实现类上标注:
@Named("motoDao")和@Named("carDao") - 注入时:
@Inject public VehicleHandler(@Named("motoDao") VehicleDao motoDao, @Named("carDao") VehicleDao carDao)
不过显然你更倾向于自定义注解的语义化方式,所以上面的自定义限定符方案更贴合你的需求。
内容的提问来源于stack exchange,提问作者Holm
相关产品推荐
相关产品推荐

