当前位置: 首页 > 知识库问答 >
问题:

Spring原型作用域bean,配置的设计模式

袁波
2023-03-14

我有一个Spring应用程序,我正在使用Vaadin编写Web UI。为此,我使用Spring Vaadin集成工具。

所以我扩展了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
    }
}

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

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

共有2个答案

公羊奇
2023-03-14

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

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

这是API文档

郤坚诚
2023-03-14

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

默认情况下,字段自动连接发生在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”。将其作为一个bean,您可以在任何需要的地方注入。该类将有一个方法“createGameMap(int-dimension,int-xcoord,int-ycoord)”

 类似资料:
  • 假设有两个类ClassA和ClassB。假设ClassB依赖于ClassA。在配置文件中,如果我们将ClassA的作用域定义为singleton,而将ClassB的作用域定义为Prototype,那么每次创建ClassA的bean实例时ClassB的实例会发生什么?每次返回ClassA实例时,会返回相同的ClassB实例还是创建新实例? 谢谢!!!

  • beanA实例与预期的一样,具有相同的哈希。但是,为什么在这种情况下,尽管beanB哈希值不同,但一个bean的两个实例之间的equals和==仍然返回true?

  • 大家好,我想了解Spring IOC中原型作用域的工作原理。 对于原型bean,我试图通过: 1来理解。读了一遍又一遍,但不能完全理解(https://docs.spring.io/spring/docs/current/spring-framework-reference/core.html#beans-factory-scopes-other-injection) 2。试着通过源代码调试,只明

  • 问题内容: 我是spring框架的新手,从一些教程开始学习它。 我有以下文件, #MainProgram.java #HelloSpring.java #Bean.xml 当我把 我的输出是: 当我把 我的输出是: 方法是用作用域bean 调用的,但不能 在以下方面为我提供帮助, 这样对吗?如果是这样,可能是什么原因? 我也有一些疑问, 之间的区别或关系是什么 问题答案: 用singleton范围

  • 主要内容:singleton,prototype默认情况下,所有的 Spring Bean 都是单例的,也就是说在整个 Spring 应用中, Bean 的实例只有一个。 我们可以在 <bean> 元素中添加 scope 属性来配置 Spring Bean 的作用范围。例如,如果每次获取 Bean 时,都需要一个新的 Bean 实例,那么应该将 Bean 的 scope 属性定义为 prototype,如果 Spring 需要每次都返回一个相同

  • 6. 原型模式(Prototype) Intent 使用原型实例指定要创建对象的类型,通过复制这个原型来创建新对象。 Class Diagram Implementation // java public abstract class Prototype { abstract Prototype myClone(); } // java public class ConcreteProt