2015-04-01 129 views
1

我試圖Autowire一個bean的實現,但它返回一個空指針異常。春季4 @Autowire沒有正確綁定?

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。乘以零。

用於測試目的我試過這個。它的工作原理,我明白在這裏我明確地獲得Bean。所以這意味着autowire不起作用?有什麼我失蹤?

Multiply m = (Multiply)factory.getBean("multiply"); 
System.out.println(m.multiplier(2,4); 
+0

發佈您的spring.xml。 – 2015-04-01 03:07:12

+0

是的,請spring.xml。你如何實例化'Calculator'? – fateddy 2015-04-01 04:55:07

+0

現在我正在從junit測試用例中調用。 – user1364861 2015-04-01 05:18:42

回答

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類沒有管理春天。實例化使用new運營商因爲沒有辦法,春天會得到一個引用注入合作者將會失敗等級:

Calculator calculator = new Calculator(); 
calculator.calcMultiply(1, 2); // would throw a NPE because the `Multiply` instance (in your case `MultiplyImpA`) has not been injected. 

所以不是實例化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會通過掃描來管理依賴關係註釋,查看字段類型並嘗試從應用程序上下文中查找合格的bean。

+0

錯字只在這裏不在我的實際程序中。感謝您指出。 – user1364861 2015-04-01 04:47:53

+0

它沒有工作。 ApplocationContext抱怨它有兩種類型的實現,然後我從applicationContext中移除了implements bean,認爲它可以工作,但它不會工作。 – user1364861 2015-04-01 15:15:25

+0

然後請發佈您的完整應用程序上下文xml和引導應用程序的單元測試/或代碼片段。否則,將很難提供幫助。 – fateddy 2015-04-01 16:27:17

1

根據類型自動裝配解析,因爲有兩個不同的impl,所以需要使用限定符來縮小它。所以試試下面。

public Calculator { 
@Autowire 
@Qualifier("multiply") 
private Multiply multiply ; 
public int calcMultiply(int a, int b){ 
    return multiply.multipler(a,b); 
} 
} 
+0

我已經試過了。它沒有幫助。我不明白爲什麼乘法仍爲空? – user1364861 2015-04-01 04:26:45