2011-10-21 32 views
9

解决冲突春天我有一个接口与@Autowired @Qualifier和

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]定义的无独特豆:预期单个匹配豆却发现2 child1service,child2service

我试图了解更多有关这些批注,但没有能够解决这个问题.. 任何指针将帮助 感谢

+0

你用什么版本的春天? – jeha

+0

弹簧3.0.5版本我正在使用 – harshit

回答

17

为了使用您需要提供与注释@Qualifier(ID)的服务,并在构造anotate与@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) 
    } 

} 
+0

是否需要指定id同时使用Service和Qualifier注释? –

+1

@DaxJoshi:你只能在'@ Qualifier'上定义它 –

-1

我觉得@Qualifier注解可能需要在同级别中提供的@Autowired注解。

+4

放置@Qualifier上面的构造函数是不允许的。 – harshit

0

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