我理解main-servlet.xml中的bean在子上下文中。基于研究我知道我可以通过WebApplicationContextUtils在我的GreetingController中获得根ApplicationContext。我将获得null,因为我没有在web.xml中定义这样的根上下文。
现在我的问题是如何在没有@AutoWired注释的情况下获取子上下文并执行类似childContext.getBean(" forfun")的事情,我想我已经测试过它并且它有效;
提前感谢您的阅读和信息。
编辑:AutoWire ApplicationContext或实现ApplicationContextAware将帮助您同时获取子ApplicationContext和
。 Edit2:我发现了另一种获取defaultdispacher创建的上下文的方法,上下文实际上存储在名为org.springframework.web.servlet.FrameworkServlet.CONTEXT的servletcontext属性中。(servletName)
假设您的默认servlet是main
,您可以通过defaultdispacher [main-servlet.xml]获取上下文文件,其代码如下。
ApplicationContext context1=(WebApplicationContext) request.getSession().getServletContext().getAttribute("org.springframework.web.servlet.FrameworkServlet.CONTEXT.main")
但仍然不明白为什么在WebApplicationContextUtils方法中我们无法访问子上下文。
web.xml文件
<webapp>
<servlet>
<servlet-name>main</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/main-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>main</servlet-name>
<url-pattern>/main/*</url-pattern>
</servlet-mapping>
</web-app>
main-servlet.xml
<beans>
<bean name ="/testing/*" class="springmvc.GreetingController"></bean>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
p:prefix="/WEB-INF/Jsp/"
p:suffix=".jsp"/>
<bean id="forfun" class="springmvc.Foo"></bean>
</beans>
GreetingController.java
@Controller
public class GreetingController {
@AutoWired
Foo forfun;//this works even if forfun is defined in main-servlet.xml
@RequestMapping("/testing")
public String testing(HttpServletRequest request){
ApplicationContext context =
WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext);
Foo f=(Foo) context.getBean("forfun");//supposed to work if i have it defined in root context
/*
I would something like this
ChildContext child = Utils.getChildContext(request);
Foo f=(Foo) child.getBean("forfun");
*/
return "test";
}
}
答案 0 :(得分:1)
您上面声明的main-servlet.xml
由DispatcherServlet
加载。
您可以使用
注入相应的WebApplicationContext
@Autowired
private WebApplicationContext context;
并使用它来获取在该上下文或父级中定义的任何bean。
请注意,只有当您注入的bean在WebApplicationContext
创建的DispatcherServlet
内创建时,此方法才有效。
或者,如M. Deinum的评论中所述,有一个名为static
的{{1}}实用程序类,它提供了getWebApplicationContext(ServletRequest)
方法来执行相同的操作。