Spring docs:
Only one annotated constructor per-class can be marked as required, but multiple non-required constructors can be annotated.
If I have one autowired constructor, all is fine. If I have two or more autowired, but required=false annotated constructors, all is fine. But if I mix them in a way, such that there is one or more required=false constructor autowiring annotations and exactly one with the required=true, it throws an exception.
org.springframework.beans.factory.BeanCreationException: Invalid autowire-marked constructor: public annotationconfig.SomeBean(annotationconfig.AnotherBean). Found another constructor with 'required' Autowired annotation: public annotationconfig.SomeBean(annotationconfig.AnotherBean,annotationconfig.AnotherBean[])
Is this expected behavior? Am I missing something about how Spring dependency injection works? If this is normal, why is this a problem for Spring, why can't it handle a setup like this?
I think the reason for that behavior is that if one of the constructors have @Autowired(required=true)
then it must be called (because it is required) and because only one constructor can be called per object instantiation then what is the point of having other constructors with @Autowired(required=false)
?
They won't be autowired anyway, because one of the constructors is already required and must be called. They can still be called without using Autowired mechanism, but in that case @Autowired(required=false)
annotation is unnecessary.
Spring 5 docs:
Only one annotated constructor per-class can be marked as required, but multiple non-required constructors can be annotated. In that case, each is considered among the candidates and Spring uses the greediest constructor whose dependencies can be satisfied, that is the constructor that has the largest number of arguments.
Although one constructor is required, spring might use the other constructors if dependancies are sesolved;
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With