by BehindJava

What is multiple spring ApplicationContext in Java

Home » springboot » What is multiple spring ApplicationContext in Java

In this tutorial we are going to learn about ApplicationContext in detail.

The definition of the spring ApplicationContext is very ambiguous, I almost finish a whole book of tutorial but still cannot understand what is the ApplicationContext stand for.

According the Spring API, ApplicationContext is:

Central interface to provide configuration for an application. This is read-only while the application is running, but may be reloaded if the implementation supports this.

The root interface for accessing a Spring bean container. This is the basic client view of a bean container.

I keep seeing the book mentioned “container”, what is the container refer to? One container does it mean one java process? or one container refer to one ApplicationContext object?

The ApplicationContext is the central interface, but the underlying container is a BeanFactory. More exactly, BeanFactory is a lower level interface implemented by all Application contextes from which you get the Beans. In that sense, I think that the word container stands here for the BeanFactory - one per ApplicationContext.

  1. If i instantiate two ApplicationContext in one java application (one Main body), are these two interface to one central container? Or two separate different instance? See the code below, what is the difference between context1 and context2? If there is a Singleton in Beans.xml, it is invoked by context1 and context2, are they two separated instance or same instance?

    ApplicationContext context1 = new ClassPathXmlApplicationContext("Beans.xml");
    ApplicationContext context2 = new ClassPathXmlApplicationContext("Beans.xml");>

    With that instanciations, you will get 2 totally independent application contexts. One bean declared in first will not be found in the other.

BUT

It is common to have more than one application context in a Web application, because Spring has a notion of hierachies of ApplicationContext. You could declare them as :

ApplicationContext context1 = new ClassPathXmlApplicationContext("Beans.xml");
ApplicationContext context2 = new ClassPathXmlApplicationContext("Beans.xml", context1);

Here you can retrieve from context1 only beans declared in it, but from context2 you will retrieve beans from context2 and context1. Specifically, beans are first looked for in context2 and if not found then looked for in context1.

This is used in Spring MVC where you normally have one root context (for all beans not directly related to the MVC DispatcherServlet) and one child context dedicated to the DispatcherServlet that will contain the beans for controllers, views, interceptors, etc.