How to register Spring @Configuration annotated class instead of applicationContext.xml file in web.xml? How to register Spring @Configuration annotated class instead of applicationContext.xml file in web.xml? spring spring

How to register Spring @Configuration annotated class instead of applicationContext.xml file in web.xml?


In web.xml you need to bootstrap the context with AnnotationConfigWebApplicationContext:

<servlet>    <servlet-name>appServlet</servlet-name>    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>    <init-param>        <param-name>contextClass</param-name>        <param-value>            org.springframework.web.context.support.AnnotationConfigWebApplicationContext        </param-value>    </init-param>    <init-param>        <param-name>contextConfigLocation</param-name>        <param-value>            org.package.YouConfigurationAnnotatedClass        </param-value>    </init-param></servlet>

And don't forget to use @EnableWebMvc for your MVC annotations to kick in.

further reading:

EDIT as a "comments follow up" => to be Turing Complete:

Yes of course you need a listener. Although the above completely answers the question "How to register Spring @Configuration annotated class instead of applicationContext.xml file in web.xml", here is an example from Spring official documentation that layouts the full web.xml:

<web-app>  <!-- Configure ContextLoaderListener to use AnnotationConfigWebApplicationContext       instead of the default XmlWebApplicationContext -->  <context-param>      <param-name>contextClass</param-name>      <param-value>          org.springframework.web.context.support.AnnotationConfigWebApplicationContext      </param-value>  </context-param>  <!-- Configuration locations must consist of one or more comma- or space-delimited       fully-qualified @Configuration classes. Fully-qualified packages may also be       specified for component-scanning -->  <context-param>      <param-name>contextConfigLocation</param-name>      <param-value>com.acme.AppConfig</param-value>  </context-param>  <!-- Bootstrap the root application context as usual using ContextLoaderListener -->  <listener>      <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>  </listener>  <!-- Declare a Spring MVC DispatcherServlet as usual -->  <servlet>      <servlet-name>dispatcher</servlet-name>      <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>      <!-- Configure DispatcherServlet to use AnnotationConfigWebApplicationContext           instead of the default XmlWebApplicationContext -->      <init-param>          <param-name>contextClass</param-name>          <param-value>              org.springframework.web.context.support.AnnotationConfigWebApplicationContext          </param-value>      </init-param>      <!-- Again, config locations must consist of one or more comma- or space-delimited           and fully-qualified @Configuration classes -->      <init-param>          <param-name>contextConfigLocation</param-name>          <param-value>com.acme.web.MvcConfig</param-value>      </init-param>  </servlet>  <!-- map all requests for /app/* to the dispatcher servlet -->  <servlet-mapping>      <servlet-name>dispatcher</servlet-name>      <url-pattern>/app/*</url-pattern>  </servlet-mapping></web-app>


Bumping up an old question here, but with recent versions of Spring (v3.0+) now you can get rid of web.xml altogether, provided you are deploying your app on a web container that supports Servlet 3.0+.

One can implement Spring's WebApplicationInitializer interface to do the same configurations that one would do in web.xml. This implementation class will be automatically detected by Spring 3.0+ app running on Servlet 3.0+ containers.

If the set up is rather simple, you could instead use another class provided by Spring as shown below. All one does here is to set the @Configuration classes and list out the servlet mappings. Keeps the setup extremely simple.

public class WebInit extends AbstractAnnotationConfigDispatcherServletInitializer{    @Override    protected Class<?>[] getRootConfigClasses() {        return null;    }    @Override    protected Class<?>[] getServletConfigClasses() {        return new Class[] {AppConfig.class};    }    @Override    protected String[] getServletMappings() {        return new String[] {                 "*.html"                ,"*.json"                ,"*.do"};    }}