自我实例化的Horizo​​ntalLayout中的自动装配服务

时间:2016-09-16 07:46:16

标签: java spring service vaadin autowired

是否有将自动装配服务传递给自我实例化视图的常用方法?假设我们有一个由Spring管理的VerticalLayout(@Autowired works)和一个Horizo​​ntalLayout按钮。我们需要创建Horizo​​ntalLayout的多个实例,按钮执行服务的某些操作(@Autowired不起作用,Service为null)。解决这个问题的最佳做法是什么?只需将服务作为参数传递给Horizo​​ntalLayout的构造函数是一个选项,但也许有更好的方法。

@Service
public class SomeService {
    public void someMethod(){
    // do something
    }
}

@SpringView(name = "SomeView")
@ViewScope
public class SomeView extends VerticalLayout {

    @Autowired
    private SomeService service;

    public SomeView(){
        addComponent(new Subview());
        addComponent(new Subview());
    }
}

public class SubView extends HorizontalLayout {

    @Autowired
    private SomeService service;

    public SubView(){
        Button btn = new Button("Test");
        btn.addClickListener(e->service.someMethod());
        addComponent(btn);
    }
}

编辑:我添加了一个代码示例。 SubView的对象为服务获取null。解决方案是将服务传递给构造函数。但我想知道,如果有更好的解决方案。

1 个答案:

答案 0 :(得分:0)

您的意思是Vaadin View还是常规组件? View必须实现View接口( com.vaadin.navigator.View ),因此您可以使用构造函数来自动装配服务,使用enter()方法来创建您的ui:

@SpringView(name = "SomeView")
@ViewScope
public class SomeView extends VerticalLayout implements View {

    private SomeService service;

    @Autowired
    public SomeView(SomeService service){
        this.service = service;
    }

    @Override 
    public void enter(ViewChangeListener.ViewChangeEvent event) {
        //service is available here
        removeAllComponents();
        addComponent(new Subview());
        addComponent(new Subview());
    }
}

它的工作方式是Spring将实例化SomeView,并在此过程中它将通过构造函数自动装配您的服务。然后,每当调用View时,它将使用 enter()方法绘制其组件。

如果它只是一个常规组件(我认为这是你的情况),那么在方法中使用 @PostConstruct 注释代替 enter()。例如:

@Autowired
public SomeView(SomeService service){
    this.service = service;
}

@PostConstruct
public void init() {
    //service is available here
    addComponent(...);
}

我没有测试过这个注释,但是广泛documented in Vaadin。如果它适合你,请告诉我。