我正面临着Vaadin spring注释的问题@UIScope,定义如下:
@SpringComponent
@SpringView(name = AdminView.VIEW_NAME)
@UIScope
public class AdminView extends NavigatingView {
...
}
Run Code Online (Sandbox Code Playgroud)
每次导航打开视图时都会创建视图.我希望它在第一次访问时只创建一次.
但是,如果我替换@UIScope为@Scope(UIScopeImpl.VAADIN_UI_SCOPE_NAME)那么它按预期工作.我错过了什么?
它@SpringView与@UIScope注释的顺序有关,因为教程和较旧的wiki页面 简要建议:
//注意注释的顺序
这可能与注释的处理方式和时间有关.我没有深入研究Vaadin代码,但根据@SpringViewjavadoc,它默认将视图放入视图范围.此外,我认为您不需要@SpringComponent注释,因为您已经使用@SpringView注册弹簧组件.
要放在应由SpringViewProvider处理的View类上的注释.
这个注释也是一个构造型注释,因此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
}
}
}
Run Code Online (Sandbox Code Playgroud)
正如您在下面的动画中所注意到的,当导航到第二个视图时,总是会创建一个新实例,而导航到第一个实例将重用初始实例:
| 归档时间: |
|
| 查看次数: |
1606 次 |
| 最近记录: |