Java NoSuchBeanDefinitionException:未定义类型为的唯一bean。而同一类型的两个bean
这是我第一次使用@autowiring,我有一个例子 我想使用类型自动连接,以便在运行时容器注入适当的对象并调用适当的bean/方法 1.接口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
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仅引用一个对象。在您的示例中,您需要指向两个不同对象的相同引用。