Spring 视图不尊重 @UIScope 注释?

2024-01-28

我遇到 Vaadin spring 注释的问题@UIScope,定义如下:

@SpringComponent
@SpringView(name = AdminView.VIEW_NAME)
@UIScope
public class AdminView extends NavigatingView {
    ...
}

每次导航打开视图时都会创建该视图。我希望它只在第一次访问时创建一次。

但是,如果我更换@UIScope with @Scope(UIScopeImpl.VAADIN_UI_SCOPE_NAME)然后它按预期工作。我错过了什么?


这与顺序有关@SpringView and @UIScope注释,如tutorial http://vaadin.github.io/spring-tutorial/#_views_and_scopes和年纪较大的 briefly建议:

// 注意注解的顺序

这可能与注释的处理方式和时间有关。我没有深入研究 Vaadin 代码,但根据@SpringView javadoc https://vaadin.com/api/vaadin-spring/com/vaadin/spring/annotation/SpringView.html它将视图放入视图范围默认情况下。此外,我认为你不需要@SpringComponent注释,因为您已经在使用@SpringView将其注册为弹簧组件。

要放置在应由 SpringViewProvider 处理的视图类上的注释。

该注解也是一个构造型注解,因此Spring会自动检测被注解的类。默认情况下,该注解还将视图放入视图范围内。您可以通过在视图类上使用另一个范围注释(例如 UI 范围)来覆盖它。然而,单例作用域将不起作用!

在下面的示例中,您将找到 2 个视图,第一个视图的注释顺序正确,第二个视图的注释顺序交换:

@SpringUI
@SpringViewDisplay
public class MyVaadinUI extends UI implements ViewDisplay {

    /* UI */

    private Panel springViewDisplay;

    @Override
    protected void init(VaadinRequest request) {
        VerticalLayout mainLayout = new VerticalLayout();
        HorizontalLayout buttonLayout = new HorizontalLayout();
        springViewDisplay = new Panel();

        buttonLayout.addComponent(new Button("1", event -> getNavigator().navigateTo(FirstView.VIEW_NAME)));
        buttonLayout.addComponent(new Button("2", event -> getNavigator().navigateTo(SecondView.VIEW_NAME)));
        mainLayout.addComponents(buttonLayout, springViewDisplay);
        setContent(mainLayout);

    }

    @Override
    public void showView(View view) {
        springViewDisplay.setContent((Component) view);
    }


    /* VIEWS */

    @UIScope
    @SpringView(name = FirstView.VIEW_NAME)
    public static class FirstView extends HorizontalLayout implements View {

        public static final String VIEW_NAME = "";

        @PostConstruct
        private void init() {
            System.out.println("Created first view");
            addComponent(new Label("First view - " + LocalDateTime.now()));
        }

        @Override
        public void enter(ViewChangeListener.ViewChangeEvent event) {
            // no-op
        }
    }

    @SpringView(name = SecondView.VIEW_NAME)
    @UIScope
    public static class SecondView extends HorizontalLayout implements View {

        public static final String VIEW_NAME = "secondView";

        @PostConstruct
        private void init() {
            System.out.println("Created second view");
            addComponent(new Label("Second view - " + LocalDateTime.now()));
        }

        @Override
        public void enter(ViewChangeListener.ViewChangeEvent event) {
            // no-op
        }
    }
}

正如您在下面的动画中注意到的那样,当导航到第二个视图时,始终会创建一个新实例,而导航到第一个视图时将重用初始实例:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring 视图不尊重 @UIScope 注释? 的相关文章

随机推荐