Kotlin中Vaadin视图配置里如何访问@Autowired注入字段
Vaadin 23 + Spring 3.0.2 视图中Service注入初始化时机问题解决方案
问题原因
Kotlin的init块在类实例构造阶段执行,而Spring的字段注入(@Autowired)是在实例构造完成后才完成的。这就导致init块执行时,someService还未完成初始化,调用时会抛出未初始化异常。
解决方案
方案1:使用构造函数注入
将依赖通过构造函数传入,Spring会在创建实例时自动注入依赖,此时init块中可以直接安全使用someService:
@Route(value = "dashboard", layout = MainView::class) @PageTitle("Dashboard") class DashboardView( private val someService: SomeService // 构造函数注入,Spring自动注入该Bean ) : VerticalLayout() { init { val grids = HorizontalLayout() grids.justifyContentMode = FlexComponent.JustifyContentMode.CENTER grids.alignItems = FlexComponent.Alignment.CENTER // 此处可直接调用someService获取数据 val tableData = someService.getTableData() // 编写表格初始化逻辑 grids.setSizeFull() add(grids) setSizeFull() justifyContentMode = FlexComponent.JustifyContentMode.CENTER alignItems = FlexComponent.Alignment.CENTER } companion object { const val VIEW_NAME = "Dashboard" } }
方案2:使用@PostConstruct注解替代init块
保留字段注入,将初始化逻辑移到标注@PostConstruct的方法中。该注解标记的方法会在Spring完成所有依赖注入后执行,此时someService已初始化完成:
@Route(value = "dashboard", layout = MainView::class) @PageTitle("Dashboard") @SpringComponent // 明确让Spring管理该视图Bean class DashboardView : VerticalLayout() { @Autowired private lateinit var someService: SomeService @PostConstruct fun initView() { val grids = HorizontalLayout() grids.justifyContentMode = FlexComponent.JustifyContentMode.CENTER grids.alignItems = FlexComponent.Alignment.CENTER // 此处可安全调用someService val tableData = someService.getTableData() // 编写表格初始化逻辑 grids.setSizeFull() add(grids) setSizeFull() justifyContentMode = FlexComponent.JustifyContentMode.CENTER alignItems = FlexComponent.Alignment.CENTER } companion object { const val VIEW_NAME = "Dashboard" } }
注意事项
- 类名需符合规范,
someService应改为SomeService(首字母大写),避免Spring扫描或语法问题。 - 构造函数注入是Spring官方推荐的依赖注入方式,能保证依赖非空,同时提升代码可测试性。
内容的提问来源于stack exchange,提问作者Someone
相关产品推荐
相关产品推荐

