Я понимаю, что бобы в моем main-servlet.xml находятся в детском контексте. И на основе исследований я знаю, что могу получить root ApplicationContext в моем GreetingController через WebApplicationContextUtils. Который я получу null, потому что я не определял такой корневой контекст в web.xml.Как получить бобы, определенные в main-servlet.xml от контроллера
Теперь мой вопрос: как я могу получить дочерний контекст и сделать что-то вроде childContext.getBean («forfun») без @AutoWired аннотации, я думаю, что я его протестировал, и он работает;
Заранее благодарим за чтение и информацию.
Редактировать: AutoWire ApplicationContext или реализовать ApplicationContextAware поможет вам получить как дочерний, так и корневой ApplicationContext.
Edit2: Я нашел другой способ получить контекст, созданный defaultdispacher, контекст на самом деле хранится в ServletContext атрибутов с именем org.springframework.web.servlet.FrameworkServlet.CONTEXT (servletName) должен сервлет по умолчанию. это main
, вы можете получить контекст craete по умолчаниюdispacher [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>
основного 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";
}
}
Почему вы хотите получить его через 'WebApplicationContext'? –
Не по практической причине просто попробуйте посмотреть, есть ли способ. – Jing