← Back to Questions
Spring Boot

What is dependency injection in Spring?

Learn What is dependency injection in Spring? with simple explanations, real-time examples, interview tips and practical use cases.

What is Dependency Injection (DI) in Spring?

Dependency Injection (DI) is one of the core concepts of the Spring Framework. It is a design pattern used to implement Inversion of Control (IoC), where the Spring Framework automatically provides required dependencies to application objects instead of developers creating them manually.

In simple terms:

  • Objects do not create dependencies themselves
  • Spring Framework injects dependencies automatically
  • Classes become loosely coupled
  • Applications become scalable and maintainable

Dependency Injection is the backbone of:

  • Spring Framework
  • Spring Boot
  • Microservices Architecture
  • Enterprise Java Applications
  • Cloud-Native Systems

Understanding Dependency

A dependency is an object that another object requires to perform its functionality.

Example:

PaymentService needs NotificationService
    

Here:

  • PaymentService is dependent on NotificationService
  • NotificationService is the dependency

Traditional Object Creation Without Dependency Injection

In traditional Java applications, developers manually create dependencies.

Example

public class PaymentService {

    private NotificationService notificationService =
        new NotificationService();

}
    

Problems with this approach:

  • Tight coupling
  • Difficult testing
  • Hard maintenance
  • Low flexibility

This approach is not suitable for large enterprise applications.


What Happens in Dependency Injection?

In Dependency Injection:

  • Spring creates objects automatically
  • Spring injects dependencies into classes
  • Developers focus only on business logic

Example

@Service
public class PaymentService {

    @Autowired
    private NotificationService notificationService;

}
    

Here:

  • Spring creates NotificationService object
  • Spring injects it into PaymentService
  • PaymentService does not create objects manually

Simple Real-Time Banking Example

Consider a banking application with:

  • Payment Service
  • Email Notification Service
  • SMS Notification Service
  • Fraud Detection Service

Without Dependency Injection:

  • Each service manually creates dependencies
  • Code becomes tightly coupled
  • Changing implementations becomes difficult

With Dependency Injection:

  • Spring manages all dependencies
  • Services remain loosely coupled
  • Implementations can change easily

How Dependency Injection Works in Spring

Application Starts
      |
Spring IoC Container Starts
      |
Beans are Created
      |
Dependencies are Injected
      |
Application Runs
    

What is Spring IoC Container?

The Spring IoC Container is responsible for:

  • Creating objects
  • Managing beans
  • Injecting dependencies
  • Managing lifecycle

It is the central part of the Spring Framework.


Types of Dependency Injection in Spring

  • Constructor Injection
  • Setter Injection
  • Field Injection

1. Constructor Injection

Dependencies are injected through the constructor.

This is the most recommended approach in enterprise applications.

Example

@Service
public class PaymentService {

    private final NotificationService notificationService;

    @Autowired
    public PaymentService(
        NotificationService notificationService) {

        this.notificationService =
            notificationService;
    }

}
    

Advantages of Constructor Injection

  • Immutable dependencies
  • Better testing
  • Cleaner code
  • Mandatory dependency validation

2. Setter Injection

Dependencies are injected using setter methods.

Example

@Service
public class PaymentService {

    private NotificationService notificationService;

    @Autowired
    public void setNotificationService(
        NotificationService notificationService) {

        this.notificationService =
            notificationService;
    }

}
    

Advantages of Setter Injection

  • Optional dependencies supported
  • Easy reconfiguration
  • Flexible dependency updates

3. Field Injection

Dependencies are injected directly into fields.

Example

@Autowired
private NotificationService notificationService;
    

Advantages of Field Injection

  • Simple syntax
  • Less boilerplate code

Disadvantages of Field Injection

  • Difficult testing
  • Hidden dependencies
  • Less maintainable

Therefore, constructor injection is preferred in enterprise applications.


Dependency Injection Using Interfaces

Dependency Injection becomes more powerful when combined with interfaces.

Example

public interface NotificationService {

    void sendNotification();

}
    
@Service
public class EmailService
implements NotificationService {

    public void sendNotification() {
        System.out.println("Email Sent");
    }

}
    
@Service
public class SMSService
implements NotificationService {

    public void sendNotification() {
        System.out.println("SMS Sent");
    }

}
    
@Service
public class PaymentService {

    @Autowired
    private NotificationService notificationService;

}
    

Spring injects the required implementation dynamically.


Benefits of Dependency Injection

  • Loose coupling
  • Easy maintenance
  • Improved scalability
  • Better testing
  • Cleaner architecture
  • Reusability

1. Loose Coupling

Classes depend on interfaces instead of concrete implementations.

This reduces direct dependency between components.


2. Better Testing

Mock implementations can be injected easily during unit testing.

Example

MockNotificationService
Used During Unit Testing
    

3. Improved Maintainability

Changes in one implementation do not affect business logic heavily.


4. Better Scalability

Applications become modular and scalable.


Dependency Injection in Spring Boot

Spring Boot heavily uses Dependency Injection for:

  • Auto configuration
  • REST APIs
  • Database management
  • Microservices
  • Security configuration

Dependency Injection in Microservices

In Microservices Architecture:

  • Services remain loosely coupled
  • Dependencies are managed efficiently
  • Testing becomes easier
  • Scalability improves

Microservices Banking Example

Payment Service
      |
Notification Service
      |
Fraud Detection Service
    

Spring injects dependencies automatically between components.


Common Spring Annotations Used in DI

  • @Autowired
  • @Component
  • @Service
  • @Repository
  • @Controller
  • @Bean

@Component Annotation

Marks a class as a Spring-managed bean.

@Component
public class NotificationService {

}
    

@Service Annotation

Used for business logic classes.

@Service
public class PaymentService {

}
    

@Repository Annotation

Used for database access classes.

@Repository
public interface UserRepository {

}
    

Dependency Injection vs Object Creation

Feature Traditional Approach Dependency Injection
Object Creation Manual Automatic
Coupling Tight Coupling Loose Coupling
Testing Difficult Easy
Scalability Low High

Real-World Enterprise Use Cases

  • Banking systems
  • E-commerce applications
  • Healthcare platforms
  • Cloud-native applications
  • Distributed microservices systems

Common Interview Questions

What is Dependency Injection in Spring?

Dependency Injection is a design pattern where Spring automatically injects required dependencies into objects instead of developers creating them manually.

Why is Dependency Injection important?

Dependency Injection reduces tight coupling, improves maintainability, supports scalability, and simplifies testing.

Which Dependency Injection type is recommended?

Constructor Injection is the most recommended approach in enterprise applications.


Professional Interview Answer

Dependency Injection (DI) in Spring is a design pattern used to implement Inversion of Control (IoC), where the Spring Framework automatically injects required dependencies into application objects instead of developers creating them manually. Spring IoC Container manages object creation, dependency injection, and lifecycle management. Dependency Injection helps achieve loose coupling, better maintainability, scalability, and easier testing in enterprise applications and microservices architectures.


Conclusion

Dependency Injection is one of the most important concepts in Spring Framework and Spring Boot.

It simplifies enterprise application development by allowing Spring to manage object creation and dependencies automatically.

Dependency Injection improves flexibility, maintainability, scalability, and testability, making it essential for modern enterprise applications, cloud-native systems, and microservices architectures.

Understanding Dependency Injection is extremely important for Java developers, Spring Boot developers, backend engineers, and software architects preparing for interviews and building enterprise-grade applications.

Why this Spring Boot question is important?

This interview question helps candidates understand real-time backend development concepts, practical problem solving, coding fundamentals, system design basics and production-ready application behavior.

Practice this question carefully for Java backend roles, Spring Boot developer interviews, microservices interviews, company interviews and full-stack developer preparation.

About the Author

Naresh Kumar is a Senior Java Backend Engineer with experience building enterprise applications using Java, Spring Boot, Microservices, Docker, Kubernetes and Cloud technologies.