Spring Autowiring by Constructor
In Spring, “Autowiring by Constructor” is actually autowiring by Type in constructor argument. It means, if data type of a bean is same as the data type of other bean constructor argument, auto wire it.
See a full example of Spring auto wiring by constructor.
1. Beans
Two beans, developer and language.
package com.mkyong.common;
public class Developer {
private Language language;
//autowire by constructor
public Developer(Language language) {
this.language = language;
}
//...
}
package com.mkyong.common;
public class Language {
private String name;
//...
}
2. Spring Wiring
Normally, you wire the bean via constructor like this :
<bean id="developer" class="com.mkyong.common.Developer">
<constructor-arg>
<ref bean="language" />
</constructor-arg>
</bean>
<bean id="language" class="com.mkyong.common.Language" >
<property name="name" value="Java" />
</bean>
Output
Developer [language=Language [name=Java]]
With autowire by constructor enabled, you can leave the constructor property unset. Spring will find the compatible data type and wire it automatcailly.
<bean id="developer" class="com.mkyong.common.Developer" autowire="constructor" />
<bean id="language" class="com.mkyong.common.Language" >
<property name="name" value="Java" />
</bean>
Output
Developer [language=Language [name=Java]]
Download Source Code
Download it – Spring-AutoWiring-by-Constructor-Example.zip (6 KB)
I think its autowiring byName in constructor
It doesn’t throw any exception when there are multiple beans with property type constructor and only bean whose id matches with property name is injected.
No it’s not it throws exception like expect one found 2 .
In 5.2.3 spring
I agree to it. I tried same in spring 4.0.3. Hoping the same behaviour in versions.
Hi MKYong,
You have fixed the constructor value here using the XML. What if I have to pass a dynamic value in constructor ?
Is there anyway to do this using annotations like @Autowire and @Value?
Is there anyway to do this using only annotations?
Actually I only can do this if I use: context.getBean(beanName, new Object[]{req, resp, params});
Big Hug.