这是我第一次使用@autowiring,我有一个例子。
我想使用 TYPE自动装配,因此在运行时容器注入适当的Object并调用适当的bean /方法。
1.INTERFACE
public interface Calculator {
public int add(int a,int b);
}
2.First Class
public class CalculatorImpl implements Calculator {
public int add(int a, int b) {
// TODO Auto-generated method stub
int result=a+b;
return result;
}
}
3.Second Class
public class CalculatorImpl2 implements Calculator{
public int add(int a, int b) {
// TODO Auto-generated method stub
int result=a-b;
return result;
}
}
4.REST CLASS
@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.应用-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>
错误:
org.springframework.beans.factory.BeanCreationException:错误 创建名为'calculationService'的bean:注入autowired 依赖失败;嵌套异常是 org.springframework.beans.factory.BeanCreationException:不能 autowire字段:com.veke.calc.Calculator com.veke.rest.CalculationService.calculator;嵌套异常是 org.springframework.beans.factory。 NoSuchBeanDefinitionException:没有 [com.veke.calc.Calculator]类型的唯一bean定义为:expected 单个匹配的bean,但找到2:[calculatorImpl,calculatorImpl2]
我做过正确的事吗?或者我错了。
我通过对@autowiring的理解完成了这项工作。
非常感谢:)
编辑:
@Qualifier
是解决这个问题的方法。(因为我在上下文中有两个相同类型的bean)。
它用于解决歧义问题。
@Autowired
按类型。
答案 0 :(得分:3)
您不能只拥有一个Calculator
实例变量,并使其同时表现为CalculatorImpl
和CalculatorImpl2
。您需要进行以下更改:
在CalculationService
:
@Autowired
@Qualifier("Impl1")
Calculator calculator;
@Autowired
@Qualifier("Impl2")
Calculator calculator2;
然后您可以在相应的方法中使用这些实例变量。
答案 1 :(得分:0)
试试以下内容: 更改以下文件:
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();
}
}