78 lines
2.5 KiB
Plaintext
78 lines
2.5 KiB
Plaintext
![]() |
The `@Autowired` annotation in Spring is used for automatic dependency injection.
|
||
|
It allows Spring to resolve and inject the required beans into your bean.
|
||
|
For example to inject a `@Repository` object into a `@Service`.
|
||
|
|
||
|
== Why is this an issue?
|
||
|
|
||
|
The Spring dependency injection mechanism cannot identify which constructor to use for auto-wiring when multiple constructors are present in a class.
|
||
|
This ambiguity can cause the application to crash at runtime, and it makes the code less clear to understand and more complex to extend and maintain.
|
||
|
|
||
|
=== What is the potential impact?
|
||
|
|
||
|
* *Incorrect Instantiation*: the wrong constructor is selected for instantiation, leading to a bean not being correctly initialized.
|
||
|
|
||
|
* *Unsatisfied Dependency Exception*: the constructor selected by Spring requires beans that are not available in the Spring context.
|
||
|
|
||
|
* *Non-Deterministic Behavior*: the constructor selected by Spring can vary, based on the number of dependencies that can be satisfied at runtime, leading to unpredictable application behavior.
|
||
|
|
||
|
* *Maintainability Issues*: adding more constructors in the future could lead to further confusion and potential bugs.
|
||
|
|
||
|
== How to fix it
|
||
|
|
||
|
Use the `@Autowired` annotation to specify which constructor to use for auto-wiring.
|
||
|
|
||
|
=== Code examples
|
||
|
|
||
|
==== Noncompliant code example
|
||
|
|
||
|
[source,java,diff-id=1,diff-type=noncompliant]
|
||
|
----
|
||
|
@Component
|
||
|
public class ExampleClass { // Noncompliant, multiple constructors present and no @Autowired annotation to specify which one to use
|
||
|
|
||
|
private final DependencyClass1 dependency1;
|
||
|
|
||
|
public ExampleClass() {
|
||
|
throw new UnsupportedOperationException("Not supported yet.");
|
||
|
}
|
||
|
|
||
|
public ExampleClass(DependencyClass1 dependency1) {
|
||
|
this.dependency1 = dependency1;
|
||
|
}
|
||
|
|
||
|
// ...
|
||
|
}
|
||
|
----
|
||
|
|
||
|
==== Compliant solution
|
||
|
|
||
|
[source,java,diff-id=1,diff-type=compliant]
|
||
|
----
|
||
|
@Component
|
||
|
public class ExampleClass {
|
||
|
|
||
|
private final DependencyClass1 dependency1;
|
||
|
|
||
|
public ExampleClass() {
|
||
|
throw new UnsupportedOperationException("Not supported yet.");
|
||
|
}
|
||
|
|
||
|
@Autowired
|
||
|
public ExampleClass(DependencyClass1 dependency1) {
|
||
|
this.dependency1 = dependency1;
|
||
|
}
|
||
|
|
||
|
// ...
|
||
|
}
|
||
|
----
|
||
|
|
||
|
|
||
|
== Resources
|
||
|
=== Documentation
|
||
|
|
||
|
* Spring - https://docs.spring.io/spring-framework/reference/core/beans/annotation-config/autowired.html[Annotation Config: Autowired]
|
||
|
|
||
|
=== Articles & blog posts
|
||
|
* Java Guides - https://www.javaguides.net/2023/08/unsatisfieddependencyexception-in.html[UnsatisfiedDependencyException in Spring Boot]
|
||
|
|