Web 应用程序上下文层次结构中的 Spring bean 范围
Posted
技术标签:
【中文标题】Web 应用程序上下文层次结构中的 Spring bean 范围【英文标题】:Spring bean scopes in web application context hierarhy 【发布时间】:2013-01-28 11:28:15 【问题描述】:我在 web.xml 文件中配置了 spring 根 web 上下文。 我和这个父母也有几个孩子的背景。所有子上下文都是手动创建的:
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] "ApplicationContext/beans.xml", rootApplicationContext);
我想在这个子上下文中管理会话和请求作用域 bean。
如何正确创建和配置子上下文以使它们能够处理 Web 应用程序范围?
现在我在尝试自动装配会话范围 bean 时出现以下错误(显然):
java.lang.IllegalStateException: No Scope registered for scope 'session'
【问题讨论】:
【参考方案1】:你的问题是
session-scope :将单个 bean 定义限定为 HTTP 会话的生命周期。仅在 Web 感知 Spring ApplicationContext 的上下文中有效。
而且您的ClassPathXmlApplicationContext
不支持网络。
我建议你去GenericWebApplicationContext
而不是ClassPathXmlApplicationContext
你可以试试这样的:
GenericWebApplicationContext context = new GenericWebApplicationContext(servletContext);
context.setParent(rootApplicationContext);
XmlBeanDefinitionReader xmlReader = new XmlBeanDefinitionReader(context);
xmlReader.loadBeanDefinitions(new ClassPathResource("ApplicationContext/beans.xml"));
context.refresh();
Spring javadoc 有用的源码:
GenericApplicationContext【讨论】:
context.setParent(rootApplicationContext) - 我错过了那行) 当我这样做时,我得到一个Cannot resolve ServletContextResource without ServletContext
。这可以通过将 servlet 上下文从根应用程序上下文传递到新的应用程序上下文来解决(为此目的,我当前的 bean 是 ApplicationContextAware
)。以上是关于Web 应用程序上下文层次结构中的 Spring bean 范围的主要内容,如果未能解决你的问题,请参考以下文章
Spring Security 3.1.4 taglib 授权/身份验证不适用于 Tomcat 7 上 JSF 2.2 中的角色层次结构