In simplest of setup, you have two application context, a root application context created by ContextLoaderListener and a web application context created by DispatcherServlet.
The web application context loaded by DispatcherServlet contains spring beans related to web components e.g. controllers, view resolvers, and handler mappings, whereas root application context contains bean loaded by ContextLoaderListener.
These beans are typically the service layer and data layer beans which implement the back-end of your Spring MVC application.
How to declare ContextLoaderListener in web.xml?
Prior to Servlet 3.0 specification, you need to declare ContextLoaderListener as a Servlet listener using <listener> tag in the deployment descriptor or web.xml file of your spring MVC based Java web application.If you remember, as per Servlet specification, listeners are components which listen for event e.g. ServletContextListener listen for events when ServletContext is created and destroyed and gives you callback in contextInitialized() and contextDestroyed() method.
2. Takes the Spring configuration files as input and creates the beans as per configuration and make it ready (destroys the bean during shutdown)
3. Configuration files can be provided like this in web.xml
4. The ContextLoaderListener is used to create root web-application-context for the web-application and puts it in the ServletContext. This context can be used to create and destroy the spring-managed beans ir-respective of what technology is being used in the controller layer(Struts or Spring MVC).
5. Spring beans loaded by ContextLoaderListener is available to all the DispatcherServlet and that's why service layer and DAO layer beans are loaded by ContextLoaderListener in Spring MVC.
6. DispatcherServlet creates its own WebApplicationContext and the handlers/controllers/view-resolvers are managed by this context.
7. When ContextLoaderListener is used along with DispatcherServlet, a root web-application-context is created first and a child-context is also created by DispatcherSerlvet and is attached to the root application-context. If a Spring bean is not found in child context then it is searched in parent or root web application context. See the diagram below from the Spring documentation.
That's all about What is ContextLoaderListener in Spring MVC, How to configure it and What is the role and use of ContextLoaderListener in Spring MVC based Java web application. As I said, the ContextLoaderListener is used to load the root application context which generally contains the beans shared between multiple DispatcherServlet. It contains beans for service layers and DAO layer, which is not specific to any DispatcherServlet.
Similarly to any other ServletListener, you can declare ContextLoaderListener in web.xml file using <listener> tag. You can also specify the context file location using param-name and param-value tags. From Servlet 3.0 onwards, you can even load root context without declaring ContextLoaderListener into web.xml file.
Similarly, HttpSessionListener listen for events related to HttpSession e.g. you receive callback on sessionCreated(HttpSessionEvent se) when an HttpSession is created and sessionDestroyed(HttpSessionEvent se) when an HttpSession is destroyed.
The ContextLoaderListener or more precisely org.springframework.web.context.ContextLoaderListener is a bootstrap listener to start up and shut down Spring's root WebApplicationContext. It doesn't perform the startup or shutdown job by itself but simply delegates to ContextLoader as well as to ContextCleanupListener. You can declare the ContextLoaderListener in web.xml as shown below:
Though, it is the not the only way to configure ContextLoaderListener in Spring MVC framework. From Servlet 3.0 specification and Spring 3.1 version you can hook ContextLoaderListener without declaring it on web.xml and by using ServletContainerInitializer interface.
The ContextLoaderListener or more precisely org.springframework.web.context.ContextLoaderListener is a bootstrap listener to start up and shut down Spring's root WebApplicationContext. It doesn't perform the startup or shutdown job by itself but simply delegates to ContextLoader as well as to ContextCleanupListener. You can declare the ContextLoaderListener in web.xml as shown below:
<web-app> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <context-param> <param-name>contextConfigLocation</param-name> <param-value> /WEB-INF/config/applicationContext-service.xml /WEB-INF/config/applicationContext-dao.xml </param-value> </context-param> </web-app>
Though, it is the not the only way to configure ContextLoaderListener in Spring MVC framework. From Servlet 3.0 specification and Spring 3.1 version you can hook ContextLoaderListener without declaring it on web.xml and by using ServletContainerInitializer interface.
If a class implements this interface then any Servlet 3.0 specification compliant container e.g. Tomcat 7 or Tomcat 8 will automatically scan and load that class.
Spring provides an implementation of ServletContainerInitializer interface as SpringServletContainerInitializer, which, in turn search for any classes that implement WebApplicationInitializer interface and delegates them for configuration.
Spring provides an implementation of ServletContainerInitializer interface as SpringServletContainerInitializer, which, in turn search for any classes that implement WebApplicationInitializer interface and delegates them for configuration.
Since Spring 3.2, you have a conviinient implemntat of WebApplicationInitializer interface as AbstractAnnotationConfigDispatcherServletInitializer, I know the name is extremely long but that's the case with any Spring class, we have to live with that. If your class extend from this abstract class then it will be automatically discovered when deployed in a Servlet 3.0 container.
You can later use all the @Configuration classes returned by getRootConfigClasses() method of AbstractAnnotationConfigDispatcherServletInitializer to configure the root application context used to be reated by ContextLoaderListener.
1. Listens during server startup/shutdown
You can later use all the @Configuration classes returned by getRootConfigClasses() method of AbstractAnnotationConfigDispatcherServletInitializer to configure the root application context used to be reated by ContextLoaderListener.
What is the role of ContextLoaderListener in Spring MVC?
Now that you know what is the ContextLoaderListener and what it does, let's revise its role in a Spring MVC based Java web application. In short it's a listener class which Listens for events e.g. server startup and shutdown. Here are its some of the usage in Spring MVC based Java application.1. Listens during server startup/shutdown
2. Takes the Spring configuration files as input and creates the beans as per configuration and make it ready (destroys the bean during shutdown)
3. Configuration files can be provided like this in web.xml
<context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring/root-config.xml</param-value> </context-param>
4. The ContextLoaderListener is used to create root web-application-context for the web-application and puts it in the ServletContext. This context can be used to create and destroy the spring-managed beans ir-respective of what technology is being used in the controller layer(Struts or Spring MVC).
5. Spring beans loaded by ContextLoaderListener is available to all the DispatcherServlet and that's why service layer and DAO layer beans are loaded by ContextLoaderListener in Spring MVC.
6. DispatcherServlet creates its own WebApplicationContext and the handlers/controllers/view-resolvers are managed by this context.
7. When ContextLoaderListener is used along with DispatcherServlet, a root web-application-context is created first and a child-context is also created by DispatcherSerlvet and is attached to the root application-context. If a Spring bean is not found in child context then it is searched in parent or root web application context. See the diagram below from the Spring documentation.
That's all about What is ContextLoaderListener in Spring MVC, How to configure it and What is the role and use of ContextLoaderListener in Spring MVC based Java web application. As I said, the ContextLoaderListener is used to load the root application context which generally contains the beans shared between multiple DispatcherServlet. It contains beans for service layers and DAO layer, which is not specific to any DispatcherServlet.
Similarly to any other ServletListener, you can declare ContextLoaderListener in web.xml file using <listener> tag. You can also specify the context file location using param-name and param-value tags. From Servlet 3.0 onwards, you can even load root context without declaring ContextLoaderListener into web.xml file.
You can use the RootConfig class to declare beans loaded by root context. The @Configuration classes returned by getRootConfigClasses() method of AbstractAnnotationConfigDispatcherServletInitializer class can be used to configure the application context reated by ContextLoaderListener.
Though you should remember that you need a Servlet 3.0 compliant container e.g. Tomcat 7 or higher to make use of this feature.
Another important thing to remember is that ContextLoaderListener is optional. You can still create Spring MVC based web application without declaring ContextLoaderListener in deployment descriptor or web.xml.
Thanks for reading this article so far. If you like this article then please share with your friends and colleagues. If you have any question or suggestion then please drop a comment and I'll try to answer your question.
Another important thing to remember is that ContextLoaderListener is optional. You can still create Spring MVC based web application without declaring ContextLoaderListener in deployment descriptor or web.xml.
Other Spring Framework articles you may
like to explore
- 15 Spring Data JPA Interview Questions with Answers
- Difference between @WebMvcTest and @DataJpaTest in Spring
- 13 Spring Boot Actuator Questions for interviews
- Top 15 Microservice Interview Questions with Answers
- 10 Advanced Spring Boot Courses for Experienced Developers
- 15 Spring Cloud Interview Questions with Answers
- How Spring MVC works internally?
- What is the use of DispatcherServlet in Spring MVC?
- 10 Best Spring Framework Courses for Beginners
- 20+ Spring Boot Interview Questions for Java developers
- Top 10 Courses to Learn Microservices with Spring Boot
- How to enable Spring security in a Java web application?
- How to limit the number of concurrent active sessions in Java web app
- How to implement LDAP authentication in the Active directory
- 17 Spring AOP Interview Questions with Answers
Thanks for reading this article so far. If you like this article then please share with your friends and colleagues. If you have any question or suggestion then please drop a comment and I'll try to answer your question.
1 comment :
Is this concept really worth to learn? I didn't even know it exists ..
Post a Comment