解决春季与@Autowired和@Qualifier的冲突

2022-09-04 07:28:21

我有一个接口

public interface ParentService{}

和两个实现类

@Service("child1service")    
public class Child1 implements ParentService{}

@Service("child2service")
public class Child2 implements ParentService{}

现在我的控制器

public class ServeChild1Controller extendds AbstractController{

 @Autowired
 public ServeChild1Controller(@Qualifier("child1service") ParentService child1service){
 super(child1service)
  } 

同样,还有ServeChild2Controller。

所以当我运行时,我得到以下错误

ServeChild1Controller 的错误:未定义类型为 [com.service.ParentService] 的唯一 Bean:预期的单个匹配 Bean,但发现 2 个子 1service,child2service

我试图阅读更多关于这些注释的信息,但无法解决它.任何指针都会有所帮助 谢谢


答案 1

为了使用特定实例,您需要使用@Qualifier(id)提供Annotate服务,并在构造函数中再次使用@Qualifier注释参数,如下所示:

@Service("child1service")
@Qualifier("child1service")
public class Child1 implements ParentService{}

@Service("child2service")
@Qualifier("child2service")
public class Child2 implements ParentService{}

而你构造函数:

public class ServeChild1Controller extendds AbstractController{

    @Autowired
    public ServeChild1Controller(@Qualifier("child1service") ParentService child1service){
        super(child1service)
    }

}

答案 2

在Spring(豆子)4.3中,它的工作方式与您在问题中编写的方式完全相同。

我可以举例说明我最近面临的实施分组。弹簧可以根据类型和限定符进行自动布线。使用服务名称是不够的,因为它们需要是唯一的,因此最终会出现类型冲突。

例:

public interface ServiceA {}
public interface ServiceB {}

@Qualifier("mockedA")    
@Service
public class MockedA implements ServiceA {}

@Qualifier("realA")
@Service
public class RealA implements ServiceA {}

@Qualifier("mockedB")    
@Service
public class MockedB implements ServiceB {}

@Qualifier("realB")
@Service
public class RealB implements ServiceB {}

@Autowired
public ABController (
    @Qualifier("mockedA") ServiceA mockedA,
    @Qualifier("realA") ServiceA realA,
    @Qualifier("mockedB") ServiceB mockedB,
    @Qualifier("realB") ServiceB realB) {
} 

推荐