Gibt es eine Möglichkeit, einen Kontext mithilfe von web.xml in einer Spring MVC-Anwendung zu laden?
Antworten:
Aus den Frühlingsdokumenten
Spring kann problemlos in jedes Java-basierte Webframework integriert werden. Sie müssen lediglich den ContextLoaderListener in Ihrer web.xml deklarieren und mithilfe einer contextConfigLocation festlegen, welche Kontextdateien geladen werden sollen.
Die <context-param>
:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext*.xml</param-value>
</context-param>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
Sie können dann den WebApplicationContext verwenden, um Ihre Beans in den Griff zu bekommen.
WebApplicationContext ctx = WebApplicationContextUtils.getRequiredWebApplicationContext(servlet.getServletContext());
SomeBean someBean = (SomeBean) ctx.getBean("someBean");
Weitere Informationen finden Sie unter http://static.springsource.org/spring/docs/2.5.x/api/org/springframework/web/context/support/WebApplicationContextUtils.html
Sie können auch die Kontextposition relativ zum aktuellen Klassenpfad angeben, was möglicherweise vorzuziehen ist
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:applicationContext*.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
*
? Ohne geht es nicht:IOException parsing XML document from ServletContext resource [/>classpath:/applicationContext.xml]; nested exception is java.io.FileNotFoundException: Could not open ServletContext resource [/>classpath:/applicationContext.xml]
Sie können den Kontext auch laden, während Sie das Servlet selbst definieren ( WebApplicationContext ).
<servlet>
<servlet-name>admin</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/spring/*.xml
</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>admin</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
eher als ( ApplicationContext )
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext*.xml</param-value>
</context-param>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
oder kann beides zusammen machen.
Der Nachteil der Verwendung von WebApplicationContext besteht darin, dass der Kontext nur für diesen bestimmten Spring-Einstiegspunkt ( DispatcherServlet
) geladen wird, wobei wie bei den oben genannten Methoden der Kontext für mehrere Einstiegspunkte (z. B. Webservice Servlet, REST servlet
usw.) geladen wird.
Der von geladene Kontext ContextLoaderListener
ist infact ein übergeordneter Kontext zu dem speziell für DisplacherServlet geladenen. Grundsätzlich können Sie also alle Ihre Business Service-, Datenzugriffs- oder Repository-Beans im Anwendungskontext laden und Ihren Controller trennen und Resolver-Beans in WebApplicationContext anzeigen.