Spring 4 @Autowire没有正确绑定?

时间:2015-04-01 02:52:05

标签: java spring annotations

我试图将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);

2 个答案:

答案 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来管理依赖项。