开发者

Getting Spring IOC to work with the MVP pattern

I'm attempting to use the MVP design pattern with a Swing application in conjunction with Spring IOC. In MVP the View needs to pass itself into the Presenter, and I can't work out how to do this with Spring.

public class MainView  implements IM开发者_如何学运维ainView {

    private MainPresenter _presenter;

    public MainView() {

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

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

    }

}

This is my config xml (incorrect)

<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>

How do I get the View into the Presenter?


You can override constructor arguments used for bean creation with BeanFactory.getBean(String name, Object... args). The shortcomings of this way are that lookup must be done by bean name rather than by its class, and that this method overrides all constructor arguments at once, so you have to use setter dependency for MyService:

 public class MainView  implements IMainView { 

    private MainPresenter _presenter; 

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

Also note the prototype scope, it's because each MainView needs its own 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>
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜