rspec/rules/S6829/java/rule.adoc

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]