一般来说,我对 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 之类的东西......