Java NoSuchBeanDefinitionException:未定义类型为的唯一bean。而同一类型的两个bean

Java NoSuchBeanDefinitionException:未定义类型为的唯一bean。而同一类型的两个bean,java,spring,inversion-of-control,autowired,Java,Spring,Inversion Of Control,Autowired,这是我第一次使用@autowiring,我有一个例子 我想使用类型自动连接,以便在运行时容器注入适当的对象并调用适当的bean/方法 1.接口 public interface Calculator { public int add(int a,int b); } 2.头等舱 public class CalculatorImpl implements Calculator { public int add(int a, int b) { // TODO Auto-ge

这是我第一次使用@autowiring,我有一个例子

我想使用类型自动连接,以便在运行时容器注入适当的对象并调用适当的bean/方法

1.接口

  public interface Calculator {

    public int add(int a,int b);
}
2.头等舱

public class CalculatorImpl implements Calculator {

public int add(int a, int b) {
    // TODO Auto-generated method stub
    int result=a+b;

    return result;
}
public class CalculatorImpl2 implements Calculator{

public int add(int a, int b) {
    // TODO Auto-generated method stub
    int result=a-b;

    return result;
}
}

3.二等舱

public class CalculatorImpl implements Calculator {

public int add(int a, int b) {
    // TODO Auto-generated method stub
    int result=a+b;

    return result;
}
public class CalculatorImpl2 implements Calculator{

public int add(int a, int b) {
    // TODO Auto-generated method stub
    int result=a-b;

    return result;
}
}

4.休息类

@Component
@Path("/calc")
    public class CalculationService {
    @Autowired
    Calculator calculator;

    @GET
    @Path("/add/{a}/{b}/")
@Qualifier("calculatorImpl")
    @Produces("text/plain")
    public Response serveAdd(@PathParam("a") int a,
            @PathParam("b") int b)
    {

        int result= calculator.add(a, b);

        return Response.status(200).entity(String.valueOf(result)).build();

    }


    @GET
    @Path("/sub/{a}/{b}")
@Qualifier("calculatorImpl2")
    public Response serveSub(@PathParam("a") int a,
            @PathParam("b") int b)
    {
        int result= calculator.add(a, b);

        return Response.status(200).entity(String.valueOf(result)).build();


    }
}
5.APPLICATION-CONTEXT.xml

<context:component-scan base-package="com.veke.rest" />

 <bean id="calculatorImpl" 
                  class="com.veke.calcImpl.CalculatorImpl"  autowire="byType"/>


  <bean id="calculatorImpl2" 
                  class="com.veke.calcImpl.CalculatorImpl2"  autowire="byType"/>

                  </beans>

错误:

<context:component-scan base-package="com.veke.rest" />

 <bean name="Impl1" id="calculatorImpl" 
                  class="com.veke.calcImpl.CalculatorImpl"  autowire="byType"/>


  <bean name="Impl2" id="calculatorImpl2" 
                  class="com.veke.calcImpl.CalculatorImpl2"  autowire="byType"/>

                  </beans>
@Component
@Path("/calc")
    public class CalculationService {
    @Autowired
    @Qualifier("Impl1"); //<-- qualifier used here.
    Calculator calculator;

    @Autowired
    @Qualifier("Impl2"); //<-- qualifier used here.
    Calculator calculator2;


    @GET
    @Path("/add/{a}/{b}/")
    @Produces("text/plain")
    public Response serveAdd(@PathParam("a") int a,
            @PathParam("b") int b)
    {

        int result= calculator.add(a, b);

        return Response.status(200).entity(String.valueOf(result)).build();

    }


    @GET
    @Path("/sub/{a}/{b}")
    public Response serveSub(@PathParam("a") int a,
            @PathParam("b") int b)
    {
        int result= calculator2.add(a, b);

        return Response.status(200).entity(String.valueOf(result)).build();


    }
}
org.springframework.beans.factory.BeanCreationException:错误 创建名为“calculationService”的bean:自动连线的注入 依赖关系失败;嵌套异常是 org.springframework.beans.factory.BeanCreationException:无法 autowire字段:com.veke.calc.Calculator com.veke.rest.CalculationService.calculator;嵌套异常是 org.springframework.beans.factory.NoSuchBean定义异常:否 定义了类型为[com.veke.calc.Calculator]的唯一bean:预期 单个匹配bean,但找到2:[calculatorImpl,calculatorImpl2]

我做了正确的事情吗?或者我错了

我在理解@autowiring的基础上完成了这项工作

非常感谢:)

编辑:
@Qualifier
是这个问题的解决方案(因为我在上下文中有两个类型相同的bean)。 它用于解决歧义问题。
@Autowired
按类型划分为

不能只有一个
Calculator
实例变量,并使其同时充当
CalculatorImpl
CalculatorImpl2
。您需要进行以下更改:

计算服务中

@Autowired
@Qualifier("Impl1")
Calculator calculator;

@Autowired
@Qualifier("Impl2")
Calculator calculator2;
然后,您可以在各自的方法中使用这些实例变量。

尝试以下操作: 更改以下文件:

APPLICATION-CONTEXT.xml:

<context:component-scan base-package="com.veke.rest" />

 <bean name="Impl1" id="calculatorImpl" 
                  class="com.veke.calcImpl.CalculatorImpl"  autowire="byType"/>


  <bean name="Impl2" id="calculatorImpl2" 
                  class="com.veke.calcImpl.CalculatorImpl2"  autowire="byType"/>

                  </beans>
@Component
@Path("/calc")
    public class CalculationService {
    @Autowired
    @Qualifier("Impl1"); //<-- qualifier used here.
    Calculator calculator;

    @Autowired
    @Qualifier("Impl2"); //<-- qualifier used here.
    Calculator calculator2;


    @GET
    @Path("/add/{a}/{b}/")
    @Produces("text/plain")
    public Response serveAdd(@PathParam("a") int a,
            @PathParam("b") int b)
    {

        int result= calculator.add(a, b);

        return Response.status(200).entity(String.valueOf(result)).build();

    }


    @GET
    @Path("/sub/{a}/{b}")
    public Response serveSub(@PathParam("a") int a,
            @PathParam("b") int b)
    {
        int result= calculator2.add(a, b);

        return Response.status(200).entity(String.valueOf(result)).build();


    }
}

休息班:

<context:component-scan base-package="com.veke.rest" />

 <bean name="Impl1" id="calculatorImpl" 
                  class="com.veke.calcImpl.CalculatorImpl"  autowire="byType"/>


  <bean name="Impl2" id="calculatorImpl2" 
                  class="com.veke.calcImpl.CalculatorImpl2"  autowire="byType"/>

                  </beans>
@Component
@Path("/calc")
    public class CalculationService {
    @Autowired
    @Qualifier("Impl1"); //<-- qualifier used here.
    Calculator calculator;

    @Autowired
    @Qualifier("Impl2"); //<-- qualifier used here.
    Calculator calculator2;


    @GET
    @Path("/add/{a}/{b}/")
    @Produces("text/plain")
    public Response serveAdd(@PathParam("a") int a,
            @PathParam("b") int b)
    {

        int result= calculator.add(a, b);

        return Response.status(200).entity(String.valueOf(result)).build();

    }


    @GET
    @Path("/sub/{a}/{b}")
    public Response serveSub(@PathParam("a") int a,
            @PathParam("b") int b)
    {
        int result= calculator2.add(a, b);

        return Response.status(200).entity(String.valueOf(result)).build();


    }
}
@组件
@路径(“/calc”)
公共类计算服务{
@自动连线

@Qualifier(“Impl1”);//在哪个类中?@Quanlifier(我应该在这里传递什么)在
Rest
类中使用它,并在
aaapplication context.xml
中为您提供bean名称,并在
Qualifier
中使用这些名称作为
@Qualifier(“calculatorImpl2”)
。上面写着NoSuchBean定义异常:没有类型唯一的bean…现在检查我的编辑有什么问题对不起,前面的命令不完整,但是这个更改只在两个不同的URI上添加了reslut。让它工作:)但是我必须创建两个实例,正如@mithun所评论的,我可以让它在单个实例上工作吗?编译时错误:属性注释类型Autowiredabove的值未定义。更改使其正常工作。但我有一个问题,为什么我不能使用相同的计算器实例变量。根据我的知识,容器注入适当的对象。这就是我们所说的IOC。感谢您的编辑。Spring在为您构建对象时注入依赖项。因此,它可以inject仅引用一个对象。在您的示例中,您需要指向两个不同对象的相同引用。