Spring框架中的构造函数依赖注入

La *_*ell 3 java spring

据我所知,构造函数注入强制执行强制依赖,而setter注入允许可选的依赖,但是...

那么这种做法是不可能的???

@Component
public class Car {

    @Autowired(required=false)
    public Car(Engine engine, Transmission transmission) {
        this.engine = engine;
        this.transmission = transmission;
    }
}
Run Code Online (Sandbox Code Playgroud)

Ser*_*hyr 6

null如果没有找到给定类型的bean,Spring将不会注入您的方法.如果设置@Autowired(required=false)setter方法,如果没有这样的bean,则不会调用此setter.构造函数无法实现.

对于Spring版本,4.1+您可以使用Java 8 Optional来声明可选的依赖项:

@Component
public class Car {

    @Autowired
    public Car(Engine engine, Optional<Transmission> transmission) {
        this.engine = engine;
        this.transmission = transmission.orElse(null);
    }
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,Spring将理解这Engine是必需的,但是Transmission是可选的.因此,如果没有Transmission找到类型的bean,Optional.empty()则注入.