2

一般来说,我对 Spring 和 Web 开发非常陌生,所以如果问题看起来很困惑或不完整,请多多包涵……

我目前正在开发一个 Spring 项目,其中有一个我称之为“requestContext”的 bean,它包含一些常用数据。这个 bean 是请求范围的,它似乎是由一个 serverlet 过滤器(GenericFilterBean 的一个子级)填充的。

我试图在 HandlerInterceptor 的 preHandle 方法中从另一个 bean(我将调用 UserBean)访问这个 bean 持有的信息。在 UserBean 中,我使用 @AutoWired 访问 bean,如下所示:

@Autowired
private RequestContext requestContext;

然后在其中一种 UserBeans 方法中,我尝试访问必要的数据。问题是请求上下文包含所有空值。我认为可能存在一些生命周期问题,对过滤器不熟悉,但是使用一些断点我可以看到过滤器在 handlerInterceptor 之前执行,并且我可以看到正在设置的请求上下文数据。在这种情况下,我希望至少能够在拦截器的 preHandle 方法中访问它,如果不是其他方法的话。

应用程序的其余部分(包括过滤器、处理程序拦截器)都是现有/已知的工作代码,所以我认为在尝试使用该 bean 之前我没有任何设置问题。我的期望或我尝试访问它的方式都存在一些问题。

更新:我发现了一个实际使用 requestContext 的类的示例。这是另一个过滤器(但直接实现过滤器而不是扩展 GenericFilterBean)。这个过滤器调用

SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this)

在它的 init() 方法中。我注意到,如果我在尝试访问 requestContext 之前进行此调用,那么它将使用我期望的值进行实例化(还请注意,如果我在默认构造函数中执行此操作,它将不起作用)。有些东西告诉我这不是我的情况的权利解决方案,但希望这能对这个问题有所了解。

尝试阅读 SpringBeanAutowiringSupport 以更好地理解。我如果我理解正确,这表明我的 bean 当前无法访问 WebApplicationContext,因此在进行此调用之前自动装配默认不工作(一旦进行调用,后续请求似乎不会要求)。这是否表明我配置 bean 的方式存在一些问题(它没有在 IoC 中正确注册?)再次,请原谅我对 spring 缺乏了解,我仍然不太了解 IoC 之类的东西......

4

1 回答 1

1

好吧,ElderMael 似乎在做某事,我的问题最终得到了这个问题的回答: Spring HandlerInterceptors 是如何实例化的?

在没有定义拦截器的范围和它使用的 bean 的情况下,它们是单例的,并且它们是使用 requestContext 的一个实例创建的。当为每个请求创建后续实例时,我仍然拥有旧的原始实例。我相信添加 processInjectionBasedOnCurrentContext 方法只是再次处理自动装配,并找到新创建的实例。我将不得不考虑解决这个问题的理想方法,但我认为因为 HandlerInterceptor 不需要保留状态,我可能也可以将它和相关的 bean 设置为请求范围。

于 2014-10-08T00:54:05.537 回答