I defined all the beans in spring and used the factory method to create views if necessary. The controller is introduced into the view, and the model and view are added to the controller through spring.
The following are code examples from a simple example that I came across to find a solution: (sorry for the long post!)
application context file:
<bean id="firstModel" class="com.model.FirstModel"></bean> <bean id="secondModel" class="com.model.SecondModel"></bean> <bean id="firstController" class="com.controller.FirstController" /> <bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"> <property name="targetObject"> <ref local="firstController" /> </property> <property name="targetMethod"> <value>addModel</value> </property> <property name="arguments"> <list> <value>FIRST</value> <ref local="firstModel" /> </list> </property> </bean> <bean id="secondController" class="com.controller.SecondController" /> <bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"> <property name="targetObject"> <ref local="secondController" /> </property> <property name="targetMethod"> <value>addModel</value> </property> <property name="arguments"> <list> <value>SECOND</value> <ref local="secondModel" /> </list> </property> </bean> <bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"> <property name="targetObject"> <ref local="secondController" /> </property> <property name="targetMethod"> <value>addModel</value> </property> <property name="arguments"> <list> <value>FIRST</value> <ref local="firstModel" /> </list> </property> </bean> <bean id="firstForm" class="com.view.FirstForm"> <property name="controller"> <ref bean="firstController" /> </property> </bean> <bean id="secondForm" class="com.view.SecondForm"> <property name="controller"> <ref bean="secondController" /> </property> </bean>
The following is an abstract controller class:
public class AbstractController implements PropertyChangeListener { Map<Type, BaseView> registeredViews; Map<Type, AbstractModel> registeredModels; public AbstractController() { registeredViews = new HashMap<Type, BaseView>(); registeredModels = new HashMap<Type, AbstractModel>(); } public void addModel(Type type, AbstractModel model) { registeredModels.put(type, model); model.addPropertyChangeListener(this); } public void removeModel(AbstractModel model) { registeredModels.remove(model); model.removePropertyChangeListener(this); } public void addView(BaseView view, Type type) { registeredViews.put(type, view); } public void removeView(javax.swing.JFrame view) { registeredViews.remove(view); } public void propertyChange(PropertyChangeEvent evt) { for (BaseView view : registeredViews.values()) { view.modelPropertyChange(evt); } } protected void setModelProperty(String propertyName, Object newValue) { for (AbstractModel model : registeredModels.values()) { Statement statment = new Statement(model, "set" + propertyName, new Object[] { newValue }); try { statment.execute(); } catch (NoSuchMethodException e) { continue; } catch (Exception e) { e.printStackTrace(); } } } }
The following is an abstract model class:
public class AbstractModel { protected PropertyChangeSupport propertyChangeSupport; public AbstractModel() { propertyChangeSupport = new PropertyChangeSupport(this); } public void addPropertyChangeListener(PropertyChangeListener listener) { propertyChangeSupport.addPropertyChangeListener(listener); } public void removePropertyChangeListener(PropertyChangeListener listener) { propertyChangeSupport.removePropertyChangeListener(listener); } protected void firePropertyChange(String propertyName, Object oldValue, Object newValue) { propertyChangeSupport.firePropertyChange(propertyName, oldValue, newValue); } }
The following is an example of interface code of the form:
public interface BaseView { void modelPropertyChange(PropertyChangeEvent evt); public abstract void showForm(); }
The following is a sample factory class code:
public class FormFactory { private ApplicationContext context; private static FormFactory viewFactory; private FormFactory() { if (context == null) { context = new ClassPathXmlApplicationContext("ApplicationContext.xml"); } } public static synchronized FormFactory getInstance() { if (viewFactory == null) { viewFactory = new FormFactory(); } return viewFactory; } public BaseView createForm(Type type) { BaseView form = null; switch (type) { case FIRST: form = (BaseView) context.getBean("firstForm"); break; case SECOND: form = (BaseView) context.getBean("secondForm"); break; default: break; } return form; } }