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

References

  1. Spring DI via constructor
  2. Spring Autowiring by Type

mkyong

Founder of Mkyong.com, passionate Java and open-source technologies. If you enjoy my tutorials, consider making a donation to these charities.

5 Comments
Most Voted
Newest Oldest
Inline Feedbacks
View all comments
yogesh murdeshwar
11 years ago

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.

Shubham Bhosale
6 years ago

No it’s not it throws exception like expect one found 2 .
In 5.2.3 spring

Lekhraj Dinkar
7 years ago

I agree to it. I tried same in spring 4.0.3. Hoping the same behaviour in versions.

Firoz
13 years ago

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?

Claudio
13 years ago

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.