2012-01-14 44 views
0

我想用一個簡單的例子來實現查找方法注射。但是,似乎無法通過該方法注入bean。春季查找方法注射不工作

我有一個簡單的bean; DemoBean創建如下:

public class DemoBean { 

    private String message; 

    public DemoBean() { 

    } 

    public DemoBean(String message) { 
     this.message = message; 
    } 

    // Getter and Setter methods 

    @Override 
    public String toString() { 
     return "DemoBean{" + 
       "message='" + message + '\'' + 
       '}'; 
    } 
} 

我試圖注入DemoBean到另一個豆即; PropertyBean:

public abstract class PropertyBean { 

    private DemoBean bean; 
    private String message; 
    // other members... 

    public PropertyBean(String message) { 
     this.message = message; 
    } 

    // Getter and Setter methods... 

    // Method for lookup injection 
    protected abstract DemoBean createBean(); 

    @Override 
    public String toString() { 
     return "PropertyBean{" + 
       "bean=" + bean.toString() + 
       ", message='" + message + '\'' + 
       ", number=" + number + 
       '}'; 
    } 
} 

野老,還有我的豆子配置:

<bean id="demobean" class="aro.discoverspring.beans.DemoBean" scope="prototype"> 
<property name="message" value="The Default Message!!!" /> 
</bean> 

<bean id="propertybean" class="aro.discoverspring.beans.PropertyBean"> 
<constructor-arg name="message" value="A message in PropertyBean"/> 
<lookup-method name="createBean" bean="demobean" /> 
</bean> 

當試圖創建的PropertyBean一個實例。我能夠這樣做。但是當我做了以下..我得到空指針異常的DemoBean創建屬性(因爲豆是沒有得到注入!!)

PropertyBean pb = (PropertyBean) ctx.getBean("propertybean");  
System.out.println(pb.toString()); 

我在做什麼錯?我錯過了什麼,或者我忽略了那裏的一些愚蠢!? Spring 3.0 reference (section 3.4.6.1)似乎也是這樣做的。

+0

在Sping鏈接中,不同之處在於您將'scope =「prototype」'放在'propertybean'中。嘗試刪除那 – Cratylus 2012-01-14 10:51:20

+0

哎呀..對不起!我的錯。我已更正了代碼 – 2012-01-14 10:54:06

回答

1

bean屬性不應注入。正如我所瞭解的彈簧工具createBean的方法,所以當你打電話給pb.createBean()它應該返回DemoBean的實例。但是您不要在ProperyBean中爲bean屬性分配任何內容,因此無法將其設置爲null。

+0

查看Spring參考(第3.4.6節)並指定第3.4.6.1節..也在參考中顯示了一個類似的示例..但是我沒有看到'creatBean()'的任何概念' ..你能提供給我任何參考嗎? – 2012-01-14 10:49:20

+0

如何在沒有註釋的情況下執行此操作? – 2012-01-14 10:56:54

+0

@AbdelOlakara這個例子有點不同,因爲他們實際上使用'createCommand'方法。當你不想用'bean'屬性污染你的類時,你可能想要使用lookup-method的方法。當你需要'DemoBean'時,你只需調用'createBean'。在這種情況下'bean'也不會被序列化。 – 2012-01-14 10:57:51