spring
IntelliJ IDEA
在 request , session , application ,和 websocket 范围只有当你使用一个基于web的Spring可ApplicationContext 实现(例如 XmlWebApplicationContext )。如果将这些范围与常规的SpringIoC容器一起使用,例如 ClassPathXmlApplicationContext , IllegalStateException 则会引发知Bean范围的异常。
为了支持bean的范围界定在 request , session , application ,和 websocket (即具有web作用域bean),需要做少量的初始配置定义你的豆之前。(标准范围不需要此初始设置: singleton 和prototype 。)
如何完成此初始设置取决于您的特定Servlet环境。
如果您在Spring Web MVC中访问scoped bean,实际上是在Spring处理的请求中,则DispatcherServlet 无需进行特殊设置。 DispatcherServlet 已暴露所有相关国家。
如果您使用Servlet 2.5 Web容器,并且在Spring之外处理请求 DispatcherServlet (例如,使用JSF或Struts时),则需要注册org.springframework.web.context.request.RequestContextListenerServletRequestListener 。对于Servlet 3.0+,可以使用该 WebApplicationInitializer 接口以编程方式完成。
或者对于旧容器,将以下声明添加到Web应用程序的 web.xml 文件中:
或者,如果您的侦听器设置存在问题,请考虑使用Spring RequestContextFilter 。过滤器映射取决于周围的Web应用程序配置,因此您必须根据需要进行更改。以下清单显示了Web应用程序的过滤器部分:
DispatcherServlet , RequestContextListener 和 RequestContextFilter 所有做同样的事情,即将HTTP请求对象绑定到 Thread 为该请求提供服务的对象。这使得请求和会话范围的bean可以在调用链中进一步使用。