2017-04-18 97 views
1

在我的项目自动装配多级继承类我里面的它通过多级继承使用@Autowired注解相关的波纹管如何在春天MVC

@Component 
@Scope("prototype") 
class A{ 


} 

@Component 
@Scope("prototype") 
class B extends A{ 

} 

@Component 
@Scope("prototype") 
class C extends B{ 

} 

现在三班我想C级对象Manager类

@Component(value = "manager") 
@Scope("prototype") 
class Manager { 

@Autowired 
A a; 

@Autowired 
B b; 

@Autowired 
C c; 

...... 
} 

这里一个 CLAS的S对象被弹簧容器注入,但同时注入对象为Ç它是作为波纹管抱怨

nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [com.abc.bca.generator.sss.B] is defined: expected single matching bean but found 2: b,c 

当我使用@Qualifier对于C类作为

@Autowired 
@Qualifier('c') 
C c 

@Autowired 
@Qualifier('c') 
B c 

它仍然显示相同的错误,所以我怎样才能得到对象为C类。

+0

我认为限定符注释应该在类上,而不是在字段上。试试看。 –

+0

我只是试过你的代码(没有@Qualifiers)。我没有看到任何例外..重新检查您的问题 – pvpkiran

+0

在我的情况下,它是同样的例外 –

回答

5

这不会起作用,因为扩展类的(子类)的bean具有父类的类名称作为bean名称,因为它们处于相同类型(父类型)中。所以这三个将具有相同的豆名'a'。 用不同的名称注释'@Bean(name = "a")''@Bean(name = "b")''@Bean(name = "c")'将解决您的问题。

例如:

class A{ 
} 

class B extends A{ 
} 

class C extends B{ 
} 



@Configuration 
public class BeanConfiguration{ 
    @Bean(name = "a") 
    public void A getA(){ 
     A a = new A(); 
     //bla bla bla 
     return a; 
    } 
    @Bean(name = "b") 
    public void B getB(){ 
     B a = new B(); 
     //bla bla bla 
     return b; 
    } 

    @Bean(name = "c") 
    public void C getC(){ 
     C c = new C(); 
     //bla bla bla 
     return c; 
    } 
} 

现在你可以自动装配A,B,C从任何你想去的地方。

+0

如何可以使用'@ Bean',如果可能请详细说明您的答案 –

+0

@Rajesh Hatwar,我编辑了答案的解释。 – maya16

+0

对不起,我尝试了你的建议,但没有运气 –