繁体   English   中英

Spring 引导请求范围 Bean 自动装配未填充

[英]Spring Boot Request Scoped Beans Autowired not Populated

我是 Spring Boot 的新手,我只喜欢使用它的依赖注入,而不是所有自以为是的框架,而是一些。 我知道此功能还有其他替代方案,但我想了解更多 Spring。

我正在尝试拥有一个请求范围的 bean 并使用常规依赖注入填充它。 我的计划是让一些我可以填充的用户 object 包含一些易于访问的自定义业务详细信息,从而使代码变得干净。

@Component
@Scope(value = "request", proxyMode = ScopedProxyMode.TARGET_CLASS)
class MyBean {
  @Autowired
  lateinit var req: HttpServletRequest

  @Autowired
  lateinit var env: Environment

  @PostConstruct
  fun pc() {
    println("I am constructed $this, $req, $env")
  }

  var a = 3
}


@RestController
class MyController {
    @GetMapping("/api/xyz")
    fun login(m: MyBean): Int {
        println("new bean m")
        return m.a
    }
}

每次我到达那个端点时,我都会看到新对象被实例化。 但是,内部依赖项不是自动装配的,它们始终是 null。 我究竟做错了什么? 我需要写一个过滤器吗? 但是我怎么知道如何找到需要初始化该 bean 的所有端点呢? 如果,我删除请求 scope 变量被初始化。

RestControllers是像ComponentsServices这样的 bean。 因此,在所有这些中,您应该以相同的方式处理注入的依赖项。

来到您添加的示例,bean 不应该是实际端点映射的参数。 请求特定于请求的信息,如标头、路径变量或有效负载主体是端点映射方法 arguments 的候选者。

对于 class MyBean的 bean 实例,您应该使用直接或通过MyController的构造函数注入的成员变量(推荐使用基于构造函数的注入方法)。

MyController的构造函数中注入RequestScopedMyBean时不要感到困惑:这完全是有意的并且有效。 Spring 实际上注入了一个代理实例,一旦您的请求到达 controller 调用,该实例将解析为请求特定的实例。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM