Using a Spring container to manage beans with the Factory pattern
Spring provides us with a container, and our application objects live in this Spring container. As shown in the following diagram, this container is responsible for creating and managing the objects:
In a Spring application, our application objects live in this Spring container
The Spring Container also wires the many Object together according to its configuration. It is configured with some initialized parameters, and manages their complete life cycle from start to finish.
Basically, there are two distinct types of Spring container:
- Bean factory
- Application contexts
Bean factory
In the Spring Framework, the org.springframework.beans.factory.BeanFactory
interface provides the bean factory, which is a Spring IoC container. XmlBeanFactory
is an implementation class for this interface. This container reads the configuration metadata from an XML file. It is based on the GOF factory method design pattern--it creates, manages, caches, and wires the application objects in a sophisticated manner. The bean factory is merely an object pool where objects are created and managed by configuration. For small applications, this is sufficient, but enterprise applications demand more, so spring provides another version of the spring container with more features.
In the next section, we will learn about the application context and how Spring creates it in the application.
Application contexts
In the Spring Framework, the org.springframework.context.ApplicationContext
interface also provides Spring's IoC container. It is simply a wrapper of the bean factory, providing some extra application context services, such as support for AOP and, hence, declarative transaction, security, and instrumentation support such as support for message resources required for internationalization, and the ability to publish application events to interested event listeners.
Creating a container with an application context
Spring provides several flavors of application context as a bean container. There are multiple core implementations of the ApplicationContext
interface, as shown here:
FileSystemXmlApplicationContext
: This class is an implementation ofApplicationContext
that loads application context bean definitions from the configuration files (XML) located in the file system.ClassPathXmlApplicationContext
: This class is an implementation ofApplicationContext
that loads application context bean definitions from the configuration files (XML) located in the classpath of the application.AnnotationConfigApplicationContext
: This class is an implementation ofApplicationContext
that loads application context bean definitions from the configuration classes (Java based) from the class path of the application.
Spring provides you with a web-aware implementation of the ApplicationContext
interface, as shown here:
XmlWebApplicationContext
: This class is a web-aware implementation ofApplicationContext
that loads application context bean definitions from the configuration files (XML) contained in a web application.AnnotationConfigWebApplicationContext
: This class is a web-aware implementation ofApplicationContext
that loads Spring web application context bean definitions from one or more Java-based configuration classes.
We can use either one of these implementations to load beans into a bean factory. It depends upon our application configuration file locations. For example, if you want to load your configuration file spring.xml
from the file system in a specific location, Spring provides you with a FileSystemXmlApplicationContext
, class that looks for the configuration file spring.xml
in a specific location within the file system:
ApplicationContext context = new FileSystemXmlApplicationContext("d:/spring.xml");
In the same way, you can also load your application configuration file spring.xml
from the classpath of your application by using a ClassPathXmlApplicationContext
class provided by Spring. It looks for the configuration file spring.xml
anywhere in the classpath (including JAR files):
ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
If you are using a Java configuration instead of an XML configuration, you can use AnnotationConfigApplicationContext
:
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
After loading the configuration files and getting an application context, we can fetch beans from the Spring container by calling the getBean()
method of the application context:
TransferService transferService = context.getBean(TransferService.class);
In the following section, we will learn about the Spring bean life cycle, and how a Spring container reacts to the Spring bean to create and manage it.