Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Spring 3.2 annotation autowiring with multiple constructors

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?

like image 610
dsplynm Avatar asked Jul 13 '14 13:07

dsplynm


2 Answers

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.

like image 175
mike_m Avatar answered Oct 19 '22 16:10

mike_m


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;

like image 5
Dimitrios Posnakidis Avatar answered Oct 19 '22 17:10

Dimitrios Posnakidis