Как заставить Spring IOC работать с шаблоном MVP - PullRequest
1 голос
/ 10 января 2010

Я пытаюсь использовать шаблон проектирования MVP с приложением Swing в сочетании с Spring IOC. В MVP View необходимо передать себя в Presenter, и я не могу понять, как это сделать с помощью Spring.

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>

Как мне получить представление о докладчике?

1 Ответ

2 голосов
/ 10 января 2010

Вы можете переопределить аргументы конструктора, используемые для создания компонента, с помощью BeanFactory.getBean(String name, Object... args). Недостатки этого способа заключаются в том, что поиск должен выполняться по имени компонента, а не по его классу, и что этот метод переопределяет все аргументы конструктора одновременно, поэтому вы должны использовать установочную зависимость для 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...