IoC and Dependency Injection
Learn about a few interview questions regarding IoC and dependency injection.
We'll cover the following
- What is Inversion of Control (IoC)?
- What are the advantages of Inversion of Control?
- What is the responsibility of an IoC container?
- Describe the two types of IoC containers.
- Give an example of the BeanFactory implementation.
- What is ApplicationContext?
- Give examples of the ApplicationContext implementations.
- What is the difference between BeanFactory and ApplicationContext?
- How is ApplicationContext configured in Spring?
- What is WebApplicationContext?
- What happens if the context is not closed?
- What is dependency injection?
- How is dependency injection related to inversion of control?
- What are the types of dependency injection?
- What is constructor injection?
- How does setter injection work?
- Explain setter injection for objects and literal values.
- Explain injection of Java Collection types.
- What is the difference between constructor and setter injection?
What is Inversion of Control (IoC)?
Suppose, class A is dependent on class B. In case of tight coupling, class A is responsible for creating an object of class B. In case of loose coupling, the framework takes the responsibility of creating and populating the dependency. The control of creating dependency shifts from the class to the framework. This is called Inversion of Control (IoC).
What are the advantages of Inversion of Control?
- IoC minimizes the amount of code in the application since the framework is now responsible for creating and wiring the dependencies.
- Inversion of Control leads to loose coupling where it becomes easy to change implementations of an interface.
- It leads to better testability as mock objects can be created for the application.
- IoC supports eager instantiation as well as lazy loading.
What is the responsibility of an IoC container?
An IoC container performs the following tasks:
- It instantiates the application class.
- It identifies the beans along with their dependencies and wires the dependencies.
- It manages the lifecycle of the beans from the time they are created till the time they are destroyed.
The IoC container uses the configuration metadata, in the form of an XML file or Java annotations, which contains instructions about the objects and their dependencies.
Describe the two types of IoC containers.
The two types of IoC containers are BeanFactory
and ApplicationContext
. These are interfaces with various implementations that act as the IoC container.
BeanFactory
provides the basic functionality of an IoC container while ApplicationContext
adds extra functionality like AOP, message resource handling for internationalization, and WebApplicationContext
for web applications.
Spring recommends using ApplicationContext
unless the resources are limited, like, for example, on a mobile device or for applet-based applications.
Give an example of the BeanFactory
implementation.
The most commonly used implementation of BeanFactory
is the XmlBeanFactory
class. This container reads the metadata from an XML config file to create a fully configured application.
What is ApplicationContext
?
ApplicationContext
is a type of IoC container. It extends the BeanFactory
interface.
Similar to the BeanFactory
, the ApplicationContext
can load bean definitions, wire beans together, and return beans upon request. Additional features of ApplicationContext
that are not part of the BeanFactory
support for AOP and internationalization, publishing events, and application layer-specific contexts like WebApplicationContext
.
Give examples of the ApplicationContext
implementations.
Commonly used implementations of ApplicationContext
are:
ClassPathApplicationXmlContext
: reads the configuration from an XML file for standalone Java applications.- AnnotationConfigApplicationContext: uses annotation-based configuration for standalone Java applications.
AnnotationConfigWebApplicationContext
andWebXmlApplicationContext
: for web applications.
What is the difference between BeanFactory
and ApplicationContext
?
The default implementation of BeanFactory
uses lazy initialization. It instantiates beans when the getBean()
method is called. ApplicationContext
extends the BeanFactory
interface but the default implementation uses eager initialization. The beans are instantiated when the application starts. However, this behavior can be overridden.
BeanFactory
does not support annotation-based dependency injection. This feature was included in ApplicationContext
.
How is ApplicationContext configured in Spring?
There are multiple ways to configure application context:
-
Application context can be configured using XML. The context can be created using the
ClassPathXmlApplicationContext
,FileSystemXmlApplicationContext
, orGenericXmlApplicationContext
class which looks for an XML file defining the configuration. -
Annotations can also be used to automatically register classes in the application context. The
@Component
annotation (along with@Controller
,@Service
, and@Repository
annotations) is used on classes, and theAnnotationConfigApplicationContext
class is used to create the application context. -
Java configuration using the
@Configuration
annotation on classes and@Bean
annotation on methods is another way to configure the application context. TheAnnotationConfigApplicationContext
class is used to create the context by scanning the annotations.
What is WebApplicationContext?
WebApplicationContext
interface extends ApplicationContext
interface. It provides configuration for web applications.
WebApplicationContext
defines request, session, and global application scopes in addition to the singleton and prototype scopes in ApplicationContext
.
It has the ability to resolve themes and decide which servlet it is associated with.
What happens if the context is not closed?
Not closing the context leads to resource leaks.
The close()
method destroys all beans, releases the locks and closes the bean factory. Similarly, using a try-with-resources block also ensures that each resource is closed when the block exits.
What is dependency injection?
Dependency injection is a concept that states that the developer should not create objects manually in the code but specify how the objects should be created. The IoC container reads this information and instantiates the object with the required dependencies.
Dependency injection is the process of finding a bean to be autowired. If class A has a dependency on class B, then the process of identifying the dependency, creating an instance of class B, and autowiring the object of class B in class A is called dependency injection.
How is dependency injection related to inversion of control?
Inversion of control (IoC) is a general concept which can be expressed in different ways. Dependency injection is an example of IoC.
IoC concept is that the control of creating and wiring the dependencies shifts from the developer to the framework. Dependency injection is the process by which the framework identifies the dependencies of an object, finds a match, and wires the dependency in the object.
What are the types of dependency injection?
A dependency can be injected in several ways:
- Field injection
- Setter injection
- Constructor injection
What is constructor injection?
In constructor injection, the IoC container creates the object by calling a constructor with a number of arguments, where each argument represents a dependency on another class.
The following code example uses a constructor to inject the Engine
dependency in Vehicle
class.
Get hands-on with 1400+ tech skills courses.