我对Spring和Web开发很新,所以如果问题看起来很混乱或不完整,请耐心等待......
我目前正在开发一个Spring项目,其中有一个bean我会调用requestContext'它包含一些常用数据。这个bean是请求范围的,它似乎由servlet过滤器(GenericFilterBean的子代)填充。
我试图在HandlerInterceptor的preHandle方法中从另一个bean(我将调用UserBean)访问此bean持有的信息。在UserBean中,我使用@AutoWired访问bean,如下所示:
@Autowired
private RequestContext requestContext;
然后在UserBeans方法之一中,我尝试访问必要的数据。问题是请求上下文包含所有空值。我认为可能存在一些生命周期问题,不熟悉过滤器,但是使用一些断点我可以看到过滤器在handlerInterceptor之前执行,我可以看到设置的请求上下文数据。在这种情况下,我希望至少能够在拦截器的preHandle方法中访问它,如果不是其他的话。
应用程序的其余部分(包括过滤器,处理程序拦截器)都是现有/已知的工作代码,所以我不认为我有任何设置问题,直到我试图使用它豆。对我的期望或我试图访问它的方式只是一些问题。
更新: 我找到了一个实际使用requestContext的类的示例。它是另一个过滤器(但直接实现Filter与扩展GenericFilterBean)。此过滤器调用
SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this)
在其init()方法中。我注意到,如果我在尝试访问requestContext之前进行此调用,那么它将使用我期望的值进行实例化(还要注意,如果我在默认构造函数中执行此操作则不起作用)。有些东西告诉我这不是我的情况下的权利解决方案,但希望这可以解释这个问题。
尝试阅读SpringBeanAutowiringSupport以更好地理解。我想如果我正确理解它,这表明我的bean目前无法访问WebApplicationContext,因此默认情况下自动装配不起作用(直到调用为止)制作,后来的请求似乎并不需要它。这是否说明了我配置bean的方式存在问题(它没有正确注册IoC?)Aagain,请原谅我对春天缺乏了解,我还是不知道那么多关于像IoC这样的东西...
答案 0 :(得分:0)
好吧,看起来ElderMael看起来像什么东西,我的问题最终得到了这个问题的回答:How are Spring HandlerInterceptors instantiated?
如果没有为拦截器和它使用的bean定义范围,它们就是单例,并且它们是使用requestContext的一个实例创建的。为每个请求创建后续实例时,我仍然拥有旧的原始实例。添加processInjectionBasedOnCurrentContext方法我相信只是再次处理自动装配,并找到新创建的实例。我必须考虑解决这个问题的理想方法,但我认为因为HandlerInterceptor不需要保留状态,所以我可以做到这一点,并且相关的bean也请求作用域。