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?

How to fix it

Use the @Autowired annotation to specify which constructor to use for auto-wiring.

Code examples

Noncompliant code example

@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

@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

Articles & blog posts