【发布时间】:2013-02-12 00:29:02
【问题描述】:
我有一个 Spring 应用程序,我正在使用 Vaadin 编写 Web UI。为此,我使用了Spring Vaadin Integration 工具。
所以我正在扩展 Vaadin 类来自定义和使用它们。例如,我有我的主 UI 类,它是一个原型。 (应该为用户打开的每个浏览器窗口实例化一个新窗口。)
@Component
@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class MainUI extends UI {
@Autowired
private GameMapView gameMapView;
@Override
protected void init(VaadinRequest request) {
final VerticalLayout layout = new VerticalLayout();
layout.setMargin(true);
setContent(layout);
gameMapView.configureGameMapView();
layout.addComponent(gameMapView);
}
}
然后导入我的 GameMapView,它也是一个原型组件,并扩展 VerticalLayout,然后我有一个 GameMap 原型组件,它扩展了 GridLayout。
现在,当我使用 GameMap 类时,我需要为它配置一个维度和一个中心图块位置。 (因此它可以设置它有多大,以及它正在查看哪些图块。)它还需要使用我的一项服务从数据库中获取要显示的正确图块。
我想做的是将这些传递给构造函数,如下所示:
@Component
@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class GameMap extends GridLayout {
@Autowired
private LandTileService lts;
public GameMap(int dimension, int xcoor, int ycoor) {
super();
this.setWidth(80, Unit.PERCENTAGE);
this.setHeight(80, Unit.PERCENTAGE);
//START configuration
this.setRows(dimension);
this.setColumns(dimension);
[use the land tile service and coordinates etc.]
//END configuration
}
}
但问题是你不能在 spring bean 的构造函数中使用自动装配的 spring bean,你也不能在自动装配的 spring bean 中使用重载的构造函数。
现在,我通过创建一个配置方法来解决这个问题,我只在我的 spring 原型类上调用一次,然后再使用它们,但这似乎是一个糟糕的解决方案。有没有更好的方法来解决这个问题?我希望能够强制 x、y 和 z 参数必须先传递给 Spring Component 游戏地图,然后才能开始使用它。
【问题讨论】: