Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring原型范围的bean,用于配置的设计模式_Java_Spring_Vaadin - Fatal编程技术网

Java Spring原型范围的bean,用于配置的设计模式

Java Spring原型范围的bean,用于配置的设计模式,java,spring,vaadin,Java,Spring,Vaadin,我有一个spring应用程序,我正在使用Vaadin编写web UI。为此,我正在使用该工具 所以我扩展了Vaadin类来定制和使用它们。例如,我有一个主UI类,它是一个原型。(应为用户打开的每个浏览器窗口实例化一个新窗口。) 这导入了我的GameMapView,它也是一个原型组件,扩展了VerticalLayout,然后我有了一个GameMap原型组件,它扩展了GridLayout 现在,当我使用GameMap类时,我需要用一个维度和一个中心平铺位置来配置它。(因此它可以设置它有多大,以及它正

我有一个spring应用程序,我正在使用Vaadin编写web UI。为此,我正在使用该工具

所以我扩展了Vaadin类来定制和使用它们。例如,我有一个主UI类,它是一个原型。(应为用户打开的每个浏览器窗口实例化一个新窗口。)

这导入了我的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
    }
}
但问题是,不能在Springbean的构造函数中使用自连线Springbean,也不能将重载构造函数与自连线Springbean一起使用


现在,我通过在使用spring原型类之前只调用一次配置方法来解决这个问题,但这似乎是一个糟糕的解决方案。有没有更好的办法?我希望能够强制执行x、y和z参数必须先传递给Spring组件gamemap,然后才能开始使用它。

有一个可以实现的接口(或者一个注释,如果您愿意),它将在设置属性(如果有的话)后触发一个要执行的方法

您还可以将属性标记为@Required。关于构造函数注入,我不确定您正面临什么问题。(我已经有一段时间没用弹簧了)

这里有一个

,但问题是不能在Springbean的构造函数中使用自动连接的Springbean,也不能将重载构造函数与自动连接的Springbean一起使用

默认情况下,字段自动连接发生在构造bean之后,因此它在构造函数上不可用

但是,您可以通过在bean配置文件中指定构造函数自动连接来使用它:

<beans:beans xmlns="..."  default-autowire="constructor">
</beans:beans>

现在,我通过在使用spring原型类之前只调用一次配置方法来解决这个问题,但这似乎是一个糟糕的解决方案。有没有更好的办法


在您的情况下,我要做的是创建一个工厂单例类“GameMapFactory”。将其作为一个bean,您可以在任何需要的地方注入。该类将有一个方法“createGameMap(intDimension,intxCoord,intyCoord)”

啊,是的。你可能是对的。我会考虑为我的游戏地图制作一个工厂。那可能是最好的。关于构造函数注入,您说得很好,但是考虑到我有注入其他bean的bean,我最好不要在spring上下文初始化期间尝试使用这些bean。
<beans:beans xmlns="..."  default-autowire="constructor">
</beans:beans>
@Service
public class FooService {
}
@Service
public class CowService {

   FooService fooService;

   //FooService will be injected when CowService bean is constructed
   public(FooService fooService) {
     this.fooService = fooService;
   }
}