【问题标题】:Resolving Spring conflict with @Autowired and @Qualifier使用 @Autowired 和 @Qualifier 解决 Spring 冲突
【发布时间】:2011-12-12 19:22:38
【问题描述】:

我有一个界面

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

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

【问题讨论】:

  • 你用的是什么版本的 Spring?
  • 我正在使用的spring 3.0.5版本

标签: java spring-mvc annotations


【解决方案1】:

为了使用特定的实例,您需要使用@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)
    }

}

【讨论】:

  • 是否需要同时指定 id 和 Service 和 Qualifier 注解?
  • @DaxJoshi:你只能在@Qualifier上定义它
  • 你可以定义为@Service("child1service")
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2017-04-11
      • 1970-01-01
      • 1970-01-01
      • 2016-12-05
      • 2020-09-01
      • 2022-12-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多