如何从控制器获取main-servlet.xml中定义的bean

时间:2014-10-02 15:36:42

标签: java spring spring-mvc servlets model-view-controller

我理解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";
    }
}

1 个答案:

答案 0 :(得分:1)

您上面声明的main-servlet.xmlDispatcherServlet加载。

您可以使用

注入相应的WebApplicationContext
@Autowired
private WebApplicationContext context;

并使用它来获取在该上下文或父级中定义的任何bean。

请注意,只有当您注入的bean在WebApplicationContext创建的DispatcherServlet内创建时,此方法才有效。

或者,如M. Deinum的评论中所述,有一个名为static的{​​{1}}实用程序类,它提供了getWebApplicationContext(ServletRequest)方法来执行相同的操作。