使用@Autowired和@Qualifier解决Spring冲突

时间:2011-10-21 18:18:39

标签: java spring-mvc annotations

我有一个界面

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 child1service,child2service

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

3 个答案:

答案 0 :(得分:22)

为了使用特定实例,您需要使用@Qualifier(id)为服务注释,并在构造函数中再次使用@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)
    }

}

答案 1 :(得分:0)

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

我可以举例说明我最近面临的实施问题。 Spring可以基于类型和限定符区分来自动装配。使用服务名称是不够的,因为它们必须是唯一的,因此您最终会遇到类型冲突。

示例:

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) {
} 

答案 2 :(得分:-1)

我认为@Qualifier注释可能需要与@Autowired注释在同一级别提供。