gpt4 book ai didi

java - 在没有循环引用的情况下使用 Spring IOC 连接 MVP?

转载 作者:行者123 更新时间:2023-12-04 05:06:54 26 4
gpt4 key购买 nike

在我的 MVP 应用程序中,我使用如下代码来连接我的 Presenter 和 View:

View view = new View();
Presenter presenter = new Presenter(view);
view.setPresenter(presenter);
View类在临时无效状态下构造,调用 setPresenter纠正。我在 View 中有一些代码抛出 IllegalStateException 的类如果在没有配置 Presenter 的情况下使用 View。

我希望 Spring 可以将这种关系与如下配置联系起来:

<bean id="presenter" class="com.foo.Presenter">
<constructor-arg ref="view" />
</bean>

<bean id="view" class="com.foo.View">
<property name="presenter" ref="presenter" />
</bean>

这失败了一个冗长的循环依赖异常。

有没有办法告诉 Spring 构建 view bean,然后构造 presenter在最终调用 view 上的 setter 之前的 bean ?

一个相关的问题是 Spring setter dependency injection after all beans have been created .但是, suggested solutions 之一是通过使用基于 setter 的接线来解决循环依赖关系,这正是我在这里没有做的。 latest manual似乎也同意 - 请参阅标题为“循环依赖项”的框:

One possible solution is to edit the source code of some classes to be configured by setters rather than constructors. Alternatively, avoid constructor injection and use setter injection only. In other words, although it is not recommended, you can configure circular dependencies with setter injection.

最佳答案

我确信有更好的解决方案,但如果一切都失败了,你可以“手动”做:

配置:

<bean id="presenter" class="com.foo.Presenter">
</bean>

<bean id="view" class="com.foo.View" init-method="init">
</bean>

查看类:
public class View implements ApplicationContextAware {

private ApplicationContext applicationContext;
private Presenter presenter;

public void init(){
presenter = (Presenter)applicationContext.getBean("presenter");
}

@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
}

作为额外说明,如果您有 annotation-driven在您的配置中,您可以执行 @Autowired private ApplicationContext applicationContext;而不是实现 ApplicationContextAware 接口(interface)。

关于java - 在没有循环引用的情况下使用 Spring IOC 连接 MVP?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15427664/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com