【问题标题】:Spring Boot Request Scoped Beans Autowired not PopulatedSpring Boot Request Scoped Beans Autowired not Populated
【发布时间】:2020-08-03 18:49:11
【问题描述】:

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

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

@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
    }
}

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

【问题讨论】:

  • 我很想知道哪些框架没有自以为是。
  • 谁说别人不自以为是?
  • 你说你不喜欢 Spring 的所有固执己见的框架。我的观点是,所有框架在某种程度上都是固执己见的。因此,我的评论。
  • 感谢您的意见和讨论。

标签: java spring-boot kotlin


【解决方案1】:

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

回到您添加的示例,bean 不应该是实际端点映射的参数。询问请求特定信息(如标头、路径变量或有效负载正文)是端点映射方法参数的候选者。

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

MyController 的构造函数中注入MyBean(即RequestScoped)时不要混淆:这完全是有意的并且有效。 Spring 实际上会注入一个代理实例,一旦您的请求到达控制器调用,它将解析为请求特定的实例。

【讨论】:

  • 所以代理处理并发问题?由于 RestController 将是应用程序作用域,单例,另一个 bean 将是请求作用域,但是每个请求中访问的对象会通过代理不同?问题不是所有方法都需要这些对象,而且我不希望它们是控制器全局的。我通常会在映射中注入 POJO,但它们需要一些其他服务来填充它们。我认为我正在寻找的是处理程序或拦截器或过滤器,但老实说,我无法在谷歌上搜索到足以找到它们。感谢您的帮助。
  • 是的,Spring 处理通过注入更广泛 bean 的代理为您的 http 线程执行提供专用于您的请求的正确实际实例。阅读 Spring 中的过滤器的一个好的开始是:baeldung.com/spring-boot-add-filter
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-15
  • 1970-01-01
  • 2016-11-23
  • 2016-07-27
  • 1970-01-01
  • 2012-10-29
  • 2021-01-07
相关资源
最近更新 更多