繁体   English   中英

Spring Prototype scoped bean,用于配置的设计模式

[英]Spring Prototype scoped bean, design pattern for configuration

我有一个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 gamemap才能开始使用它。

但问题是你不能在spring bean的构造函数中使用自动装配的spring bean,并且你也不能使用带有自动装配的spring bean的重载构造函数。

默认情况下,字段自动装配发生在构造bean之后,因此它在构造函数中不可用。

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

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

然后你可以从构造函数注入你的bean

@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;
   }
}

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

在你的情况下,我要做的是创建一个工厂单例类“GameMapFactory”。 把它放在一个豆子里,你可以在任何你需要的地方注射。 该类将有一个方法“createGameMap(int dimension,int xcoord,int ycoord)”

你可以实现一个接口(或者你喜欢的注释),它会在设置属性后触发一次执行的方法(如果有的话)。

您还可以将属性标记为@Required。 关于构造函数注入,我不确定你面临的问题到底是什么。 (自从我使用Spring以来已经有一段时间了)。

这是API文档

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM