2010-01-10 51 views
1

我正在嘗試將Swing應用與Spring IOC一起使用MVP設計模式。在MVP中,View需要將自己傳遞給Presenter,並且我無法弄清楚如何使用Spring做到這一點。讓Spring IOC與MVP模式一起工作

public class MainView implements IMainView { 

    private MainPresenter _presenter; 

    public MainView() { 

     _presenter = new MainPresenter(this,new MyService()); 

     //I want something more like this 
     // _presenter = BeanFactory.GetBean(MainPresenter.class); 

    } 

} 

這是我的配置XML(不正確)

<bean id="MainView" class="Foo.MainView"/> 
<bean id="MyService" class="Foo.MyService"/> 

<bean id="MainPresenter" class="Foo.MainPresenter"> 
    <!--I want something like this, but this is creating a new instance of View, which is no good--> 
    <constructor-arg type="IMainView"> 
     <ref bean="MainView"/> 
    </constructor-arg> 
    <constructor-arg type="Foo.IMyService"> 
     <ref bean="MyService"/> 
    </constructor-arg> 
</bean> 

我如何查看到演示?

+0

我不明白......你註釋掉注入的觀點到演示時,配置的部件,它是你在做什麼問怎麼做...什麼給了? – skaffman 2010-01-10 17:02:03

+0

改變了問題,使其更清晰 - 我評論它不正確。 – Dan 2010-01-10 17:14:49

+0

好的,但該配置不是創建視圖的新實例,而是將引用傳遞給現有的'MainView' bean – skaffman 2010-01-10 17:18:21

回答

2

您可以用BeanFactory.getBean(String name, Object... args)覆蓋用於bean創建的構造函數參數。這種方式的缺點是查找必須由bean的名字來完成,而不是通過其類,而且此方法將覆蓋一次所有構造函數的參數,所以你必須使用setter方法依賴於MyService

public class MainView implements IMainView { 

    private MainPresenter _presenter; 

    public MainView() { 
     _presenter = beanFactory.getBean("MainPresenter", this); 
    } 
} 

還要注意在prototype範圍,這是因爲每個MainView需要自己MainPresenter

<bean id="MyService" class="Foo.MyService"/> 

<bean id="MainPresenter" class="Foo.MainPresenter" scope = "prototype"> 
    <constructor-arg type="IMainView"><null /></constructor-arg> 
    <property name = "myService"> 
     <ref bean="MyService"/> 
    </property> 
</bean>