Can you use Autowired with static fields?
Object-Oriented Design practice on Codemia
Turn requirements into classes, and defend the design, on the problems that come up in OOD rounds.
Introduction
In Spring Framework, dependency injection is a core concept that helps in decoupling components by injecting dependencies at runtime rather than compile time. One of the commonly used annotations in Spring for this purpose is @Autowired, which is used to automatically wire beans by type. However, there are certain scenarios where developers might wonder about its efficacy, like using @Autowired with static fields. This article will explore the feasibility and implications of using @Autowired with static fields in Spring.
Understanding @Autowired
The @Autowired annotation in Spring allows Spring to resolve and inject collaborating beans into your bean. By default, it injects dependencies by type, and if multiple beans of the same type exist, it tries to match by qualifier or name. Here's a simple example:
In this example, MyRepository is injected into MyService at runtime.
Static Fields in Java
Before diving into @Autowired with static fields, it's essential to understand what static fields are. A static field belongs to the class rather than any specific instance. It is shared among all instances of the class, which implies that static fields are initialized once per classloader.
Why @Autowired doesn't work with Static Fields
- Instance Context: The most fundamental reason is that
@Autowiredworks within the context of an instance. The Spring container manages beans as instances, and dependency injection inherently relies on instance context for resolving dependencies. - Lifecycle Management: Static fields live and die with the classloader, while Spring beans have their lifecycle managed by the Spring container. This means that static fields fall outside the purview of the container's lifecycle management.
- Predictability: Injecting static fields can lead to unpredictable behavior, especially in multi-threaded environments, because static fields are shared across instances.
Here is an example where a developer might try to use @Autowired on a static field:
In this scenario, repository will remain null if @Autowired is used directly on the static field.
Workarounds for Static Field Injection
- Setter Injection: Although static injection is not feasible directly, a static method can use instance fields by injecting dependencies using setter methods.
- Using ApplicationContext: Another approach involves accessing the
ApplicationContextstatically.
Table: Key Points of @Autowired with Static Fields
| Aspect | Details |
| Instance Context | @Autowired relies on instance context for injection. |
| Lifecycle Management | Static fields are beyond the Spring container's lifecycle management. |
| Predictability | Using static fields with @Autowired can lead to unpredictable behavior in applications. |
| Workaround: Setter Injection | Use setter methods to inject dependencies into static fields indirectly. |
| Workaround: ApplicationContext | Utilize ApplicationContext to retrieve beans in static context. |
Conclusion
Using @Autowired with static fields is contrary to the design and purpose of the Spring Framework. The lifecycle and scope of static fields are fundamentally different from those of beans managed by Spring. However, workarounds like setter injection and leveraging ApplicationContext can be used to achieve similar outcomes, albeit with caution and clear understanding of implications. Proper understanding and following of Spring's dependency injection principles ensure predictable and maintainable application behavior.
Related reading
- Can you write virtual functions / methods in Java?
- Cannot Inject Dependencies into ASP.NET Web API Controller using Unity
- Can't Autowire Repository annotated interface in Spring Boot
- Cast ListT to ListInterface
- cannot access org.springframework.context.ConfigurableApplicationContext class file
- Cannot be cast to class - they are in unnamed module of loader 'app
- Cast Object to Generic Type for returning
- Chain-calling parent initialisers in python

OOD Fundamentals
Master object-oriented design from first principles, SOLID, design patterns, and classic interview problems with hands-on coding.
View the courseTrack what you have practised
A free account saves your progress, solutions and study plan across every problem on Codemia.
Object-Oriented Design practice on Codemia
Turn requirements into classes, and defend the design, on the problems that come up in OOD rounds.