是否有将自动装配服务传递给自我实例化视图的常用方法?假设我们有一个由Spring管理的VerticalLayout(@Autowired works)和一个HorizontalLayout按钮。我们需要创建HorizontalLayout的多个实例,按钮执行服务的某些操作(@Autowired不起作用,Service为null)。解决这个问题的最佳做法是什么?只需将服务作为参数传递给HorizontalLayout的构造函数是一个选项,但也许有更好的方法。
@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。解决方案是将服务传递给构造函数。但我想知道,如果有更好的解决方案。
答案 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。如果它适合你,请告诉我。