据我所知,构造函数注入强制执行强制依赖,而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)
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()则注入.