我试图将bean自动装入一个实现,但它返回一个空指针Exception。
package org.com.api;
public interface Multiply {
public int multipler(int a, int b);
}
package org.com.core;
import org.com.api.Multiply;
public class MultiplyImpA implements Multiply {
public int multipler(int a, int b){
return a*b;
}
}
package org.com.core;
import org.com.api.Multiply;
public class MultiplyImpB implements Multiply {
public int multipler(int a, int b){
int total = 0;
for(int i = 1; i <=b; i++){
total += a;
}
return total;
}
}
package org.com.Service;
import org.com.api.Multiply;
public Calculator {
@Autowire
private Multiply multiply;
public int calcMultiply(int a, int b){
return multiply.multipler(a,b);
}
}
在我的applicationContext.xml中,我添加了以下内容
<bean id="multiply" class="org.com.core.MultiplyImpA" scope="prototype"/>
现在在运行时我得到一个NullPointerExpection。 multiply为null。
出于测试目的,我尝试了这个。它的工作原理,我明白在这里我明确地得到了Bean。那么这意味着autowire没有用?有什么我想念的吗?
Multiply m = (Multiply)factory.getBean("multiply");
System.out.println(m.multiplier(2,4);
答案 0 :(得分:1)
自动装配按类型解析,因为有两种不同的impl,您需要使用限定符来缩小它。所以尝试以下。
public Calculator {
@Autowire
@Qualifier("multiply")
private Multiply multiply ;
public int calcMultiply(int a, int b){
return multiply.multipler(a,b);
}
}
答案 1 :(得分:0)
好像你的bean xml中有拼写错误。
而不是
<bean id="multiply" class="package org.com.core.MultiplyImpA" scope="prototype"/>
应该是(仅使用完全限定的类名)
<bean id="multiply" class="org.com.core.MultiplyImpA" scope="prototype"/>
修改强>
可能的错误可能是Calculator
类不是由spring管理的。使用new
运算符实例化类会失败,因为spring无法获得引用协作者的引用:
Calculator calculator = new Calculator();
calculator.calcMultiply(1, 2); // would throw a NPE because the `Multiply` instance (in your case `MultiplyImpA`) has not been injected.
因此,使用spring:
实例化Calculator
类
<bean id="calculator" class="org.com.service.Calculator"/>
<bean id="multiply" class="org.com.core.MultiplyImpA"/>
通过应用程序上下文检索它:
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("application-context.xml");
Calculator calculator = ctx.getBean(Calculator.class);
然后,Spring将通过扫描@Autowired
注释,查看字段类型并尝试从应用程序上下文中查找限定bean来管理依赖项。