如何在具有扩展另一个接口的接口的实现上设置限定符

时间:2019-01-18 12:03:39

标签: java spring spring-boot

我有2个接口A和B,它们扩展了另一个接口C。但是,当我使用@Qualifier(“ aImpl”)时,我从spring获得了不满意的依赖关系

接口

public interface EsResourceLoader { ... }

public interface CommonEsDao extends EsResourceLoader { ... }

public interface CommonModifiedEsDao extends EsResourceLoader { ... }

第一个实现

@Service
public class LBModifiedEsDao implements CommonModifiedEsDao { ... }

第二个实现

@Service
public class LBDao implements CommonEsDao { 

  private CommonModifiedEsDao myDao;

  @Autowired
  public LBDao(@Qualifier("lBModifiedEsDao") CommonModifiedEsDao myDao) { ... 
  }
}

控制器抛出异常

@RestController
@RequestMapping{...}
public class IndexAdminController {

  private CommonEsDao esDao;

  @Autowired
  public IndexAdminController(@Qualifier("lBDao")CommonEsDao esDao){ ... }


}

这是例外

Exception encountered during context initialization - cancelling refresh 
attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: 
Error creating bean with name 'indexAdminController': Unsatisfied dependency 
expressed through field 'lbDao';

1 个答案:

答案 0 :(得分:0)

将您的@Qualifier批注投入服务,它应该可以工作。

@Service
@Qualifier("lBModifiedEsDao") 
public class LBModifiedEsDao
implements CommonModifiedEsDao { ... }

还有第二种服务

@Service
@Qualifier("lBDao")
public class LBDao implements CommonEsDao { 

  private CommonModifiedEsDao myDao;

  @Autowired
  public LBDao(@Qualifier("lBModifiedEsDao") CommonModifiedEsDao myDao) { ... 
  }
}

现在,Spring应该能够始终正确地对其进行自动接线。同样,这也很好,因为您可以肯定将始终具有正确的实现。

编辑:就像我在您的代码中使用@Qualifier注释一样,可以通过在组件注释中使用名称来实现,即:@Component("myComponent")