Maybe something like
public class LoginView {
@Autowired
public void initPresenter(LoginPresenter loginPresenter) {
loginPresenter.setLoginView(this);
loginPresenter.bind();
}
}
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class LoginPresenter {
private LoginView loginView;
public void bind() {
// ...
}
public LoginView getLoginView() {
return loginView;
}
public void setLoginView(LoginView loginView) {
this.loginView = loginView;
}
}
Edit
You can decouple adding a configuration interface but adds some complexity, for example
public interface View {
}
public interface Presenter {
void setView(View view);
void bind();
}
public interface ViewManager {
void configure(View view);
}
public class ViewSupport implements View {
@Autowired
private ViewManager viewManager;
@PostConstruct
public void init() {
viewManager.configure(this);
}
}
/**
* ViewManager that configure Presenters following
* the naming convention XXView->XXPresenter
*/
public class DefaultViewManager implements ViewManager {
@Autowired
private ApplicationContext applicationContext;
@Override
public void configure(View view) {
Presenter p = (Presenter) applicationContext.getBean(getPresenterName(view.getClass()));
p.setView(view);
p.bind();
}
protected String getPresenterName(Class<?> clazz) {
return StringUtils.uncapitalize(clazz.getSimpleName()).replace("View", "Presenter");
}
}