Main Tutorials

Spring Auto-Wiring Beans with @Autowired annotation

In last Spring auto-wiring in XML example, it will autowired the matched property of any bean in current Spring container. In most cases, you may need autowired property in a particular bean only.

In Spring, you can use @Autowired annotation to auto wire bean on the setter method, constructor or a field. Moreover, it can autowired property in a particular bean.

Note
The @Autowired annotation is auto wire the bean by matching data type.

See following full example to demonstrate the use of @Autowired.

1. Beans

A customer bean, and declared in bean configuration file. Later, you will use “@Autowired” to auto wire a person bean.


package com.mkyong.common;

public class Customer 
{
	//you want autowired this field.
	private Person person;
	
	private int type;
	private String action;
	
	//getter and setter method
	
}

<beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

	<bean id="CustomerBean" class="com.mkyong.common.Customer">
		<property name="action" value="buy" />
		<property name="type" value="1" />
	</bean>

	<bean id="PersonBean" class="com.mkyong.common.Person">
		<property name="name" value="mkyong" />
		<property name="address" value="address 123" />
		<property name="age" value="28" />
	</bean>
	
</beans>

2. Register AutowiredAnnotationBeanPostProcessor

To enable @Autowired, you have to register ‘AutowiredAnnotationBeanPostProcessor‘, and you can do it in two ways :

1. Include <context:annotation-config />

Add Spring context and <context:annotation-config /> in bean configuration file.


<beans 
	//...
	xmlns:context="http://www.springframework.org/schema/context"
	//...
	http://www.springframework.org/schema/context
	http://www.springframework.org/schema/context/spring-context-2.5.xsd">
	//...

	<context:annotation-config />
	//...
</beans>

Full example,


<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
	http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
	http://www.springframework.org/schema/context
	http://www.springframework.org/schema/context/spring-context-2.5.xsd">

	<context:annotation-config />

	<bean id="CustomerBean" class="com.mkyong.common.Customer">
		<property name="action" value="buy" />
		<property name="type" value="1" />
	</bean>

	<bean id="PersonBean" class="com.mkyong.common.Person">
		<property name="name" value="mkyong" />
		<property name="address" value="address ABC" />
		<property name="age" value="29" />
	</bean>
	
</beans>
2. Include AutowiredAnnotationBeanPostProcessor

Include ‘AutowiredAnnotationBeanPostProcessor’ directly in bean configuration file.


<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
	http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

<bean 
class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>
	
	<bean id="CustomerBean" class="com.mkyong.common.Customer">
		<property name="action" value="buy" />
		<property name="type" value="1" />
	</bean>

	<bean id="PersonBean" class="com.mkyong.common.Person">
		<property name="name" value="mkyong" />
		<property name="address" value="address ABC" />
		<property name="age" value="29" />
	</bean>
	
</beans>

3. @Autowired Examples

Now, you can autowired bean via @Autowired, and it can be applied on setter method, constructor or a field.

1. @Autowired setter method

package com.mkyong.common;

import org.springframework.beans.factory.annotation.Autowired;

public class Customer 
{
	private Person person;
	private int type;
	private String action;
	//getter and setter methods
	
	@Autowired
	public void setPerson(Person person) {
		this.person = person;
	}
}
2. @Autowired construtor

package com.mkyong.common;

import org.springframework.beans.factory.annotation.Autowired;

public class Customer 
{
	private Person person;
	private int type;
	private String action;
	//getter and setter methods
	
	@Autowired
	public Customer(Person person) {
		this.person = person;
	}
}
3. @Autowired field

package com.mkyong.common;

import org.springframework.beans.factory.annotation.Autowired;

public class Customer 
{
	@Autowired
	private Person person;
	private int type;
	private String action;
	//getter and setter methods
}

The above example will autowired ‘PersonBean’ into Customer’s person property.

Run it


package com.mkyong.common;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class App 
{
    public static void main( String[] args )
    {
    	ApplicationContext context = 
    	  new ClassPathXmlApplicationContext(new String[] {"SpringBeans.xml"});
    	
    	Customer cust = (Customer)context.getBean("CustomerBean");
    	System.out.println(cust);
    	
    }
}

Output


Customer [action=buy, type=1, 
person=Person [address=address 123, age=28, name=mkyong]]

Dependency checking

By default, the @Autowired will perform the dependency checking to make sure the property has been wired properly. When Spring can’t find a matching bean to wire, it will throw an exception. To fix it, you can disable this checking feature by setting the “required” attribute of @Autowired to false.


package com.mkyong.common;

import org.springframework.beans.factory.annotation.Autowired;

public class Customer 
{
	@Autowired(required=false)
	private Person person;
	private int type;
	private String action;
	//getter and setter methods
}

In the above example, if the Spring can’t find a matching bean, it will leave the person property unset.

@Qualifier

The @Qualifier annotation us used to control which bean should be autowire on a field. For example, bean configuration file with two similar person beans.


<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
	http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
	http://www.springframework.org/schema/context
	http://www.springframework.org/schema/context/spring-context-2.5.xsd">

	<context:annotation-config />

	<bean id="CustomerBean" class="com.mkyong.common.Customer">
		<property name="action" value="buy" />
		<property name="type" value="1" />
	</bean>

	<bean id="PersonBean1" class="com.mkyong.common.Person">
		<property name="name" value="mkyong1" />
		<property name="address" value="address 1" />
		<property name="age" value="28" />
	</bean>
	
	<bean id="PersonBean2" class="com.mkyong.common.Person">
		<property name="name" value="mkyong2" />
		<property name="address" value="address 2" />
		<property name="age" value="28" />
	</bean>
	
</beans>

Will Spring know which bean should wire?

To fix it, you can use @Qualifier to auto wire a particular bean, for example,


package com.mkyong.common;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;

public class Customer 
{
	@Autowired
	@Qualifier("PersonBean1")
	private Person person;
	private int type;
	private String action;
	//getter and setter methods
}

It means, bean “PersonBean1” is autowired into the Customer’s person property. Read this full example – Spring Autowiring @Qualifier example

Conclusion

This @Autowired annotation is highly flexible and powerful, and definitely better than “autowire” attribute in bean configuration file.

Download Source Code

About Author

author image
Founder of Mkyong.com, love Java and open source stuff. Follow him on Twitter. If you like my tutorials, consider make a donation to these charities.

Comments

Subscribe
Notify of
62 Comments
Most Voted
Newest Oldest
Inline Feedbacks
View all comments
Stephen
9 years ago

Perhaps you may put a note that @Autowired will only work for the object where it’s initialized as bean in spring. I have a class and one of the property/setter is annotated with @Autowired, if I instantiate the class by using new Abc() the @Autowired won’t work, I have to declare before I can see the result. Also annotating the class with @Component also does the same magic, I guess basically they’re the same thing.

This could be intuitive for certain people but at least I’ve spent not less than 30 minutes just trying to figure out what has gone wrong. Hope it helps!

Deepak Pandey
8 years ago

can you please explain which type of DI is best and why among the constructor based,setter based and field based injection.

yogesh prajapati
9 years ago

xml mapping for annotations is compulsory?.
is there any way that i wire my bean without any xml mapping.

Asif Garhi
6 years ago

It would have been nice if you also showed the PersonBean class

shaik
5 years ago

Nice one, Really helpful!!!

Akhil Bansal
8 years ago

I am facing one problem that might interest you and you might like to have a post on it. My requirement is to Autowire an instance that requires constructor arguments to be passed. But it keeps on giving me error that default constructor not found for the bean.

Something like this…
// bean to be autowired
class A {
private int a;
public A(int a) {
}
}

// main class
class B {
@Autowired
private A a;
}

Although I have declared in spring context a bean where constructor argument is specified for bean A

Tauqeer
10 years ago

Very good I clear my doubts.

pirater compte facebook en ligne 2013
10 years ago

Highly energetic article, I loved that bit. Will there be a part
2?

Fletcher
10 years ago

Aw, this was an incredibly nice post. Taking a few minutes and
actual effort to create a really good article_ but what can I say_
I procrastinate a lot and never ssem to get anything done.

Milagros
10 years ago

I was curious if you ever thought of changing the layout of your
site? Its very well written; I love what youve ggot to say.
Buut maqybe you could a little more in thhe way of contdnt so people
could connect with it better. Youve got an awful lot of
text for only havving one or 2 images. Maybe
you could space iit outt better?

shellac nail polish
10 years ago

What’s up, after reading this amazing piece of writing i am also cheerful to share my know-how here with colleagues.

Librerias en guadalajara
10 years ago

We are a group of volunteers and opening a new
scheme in our community. Your website provided us with valuable information to work on.
You’ve done a formidable job and our entire community will be thankful to you.

http://dietasmilagrosas.over-blog.com/o-fort-max-diet-resulta
10 years ago

Thank you for the auspicious writeup. It actually was once a leisure account it.
Glance complex to more added agreeable from you! By the way,
how can we keep in touch?

http://cardapioemagrecer.wordpress.com/
10 years ago

Undeniably consider that that you stated. Your favourite reason appeared to bbe
on the net the easiest factor to kesp inn mind of.
I say to you, I certainly get annoyed while folks think about concerns
that they just do not recognize about. You managed to
hit the nail upon the top as neztly as defined out the whole thing with no need side effect , othher folks could tale a signal.
Wiill likely be baxk to get more. Thhank you

Katlyn
10 years ago

I simply couldn’t go away your website before suggesting that I really enjoyed the usual information a person supply in your visitors?
Is going to be back frequently in order to
check out new posts

Johnny
10 years ago

WOW just what I was searching for. Came here by searching for spring

Anonymous
10 years ago

Howdy! I just wish to give an enormous thumbs up for the good data you will have here on this post.
I will likely be coming back to your weblog for more soon.

http://www.miradeed.com/pd/pd-class_list.asp?db_pd=miniSAS/SAS
10 years ago

Excellent excited analytical eyesight with regard to details and
may anticipate problems prior to they happen.

Katherina
10 years ago

I every time spent my half an hour to read this blog’s articles everyday along with a cup of coffee.

mca
10 years ago

By starting an affiliate program, Motor Club Of America is tapping
into all the exposure and advertising that affiliates create without spending a dime on outdated and ineffective advertising strategies.
95 every month after the two months are up for that membership, you will immediately get 200%
commission via $80 for that one person. That is why, when a person’s living pattern is suddenly broken for no apparent reason, it can be the sign of an affair.

dietrich bonhoeffer quotes life together
10 years ago

Hi to all, it’s truly a good for me to pay a visit this website, it consists of important Information.

http://ww.rudenskiy.ru/
10 years ago

I used to be suggested this blog through my cousin. I’m now not certain whether this post is written by way of him as no one else know such special about my difficulty. You’re incredible!
Thank you!

Arletha
10 years ago

Howdy! Would you mind if I share your blog with my twitter group?
There’s a lot of people that I think would really enjoy your content. Please let me know. Many thanks

best senuke xcr hosting
10 years ago

The most unique aspect of a virtual private server is that
it provides with the flexibility to add and change modules for
installing your own software, this includes the features and functionality of a dedicated server without the cost of
a dedicated server. Unlike shared hosting, VPS guarantees the dedicated
resources with full control to webmasters which makes it extremely suitable for medium to large websites.
Web hosting services is one of the Denver IT support services which
has became an essential requirement for you if you want to have a sure
success into your company.

seo backlinks analyzer tools
10 years ago

Many people aims to optimize their website and gain recognition by the Search Engine.
These links are considered as spamming and are ignored by the search engine spiders.
Higher page rank internet sites this sort of as Twitter, Facebook
or even blog network web sites make it possible for you to develop
a cost-free profile on their web-site. The more relevant the
website to yours will look good for you and Google will
like it to. If the social sites think you are only bookmarking your own site’s links, they could ban you. Link building by the use of content writing services is an important step in making a website functional for two important reasons.

clonazepam
10 years ago

I’ve learn a few just right stuff here. Definitely worth bookmarking for revisiting. I wonder how a lot effort you set to create this type of great informative site.

why is it called disseminated herpes zoster
10 years ago

This is the right blog for everyone who would like to understand this topic.
You understand so much its almost tough to argue with you (not that I really would want to_HaHa).
You certainly put a brand new spin on a subject that has been written about
for a long time. Wonderful stuff, just excellent!

Sugar land Limousine
10 years ago

To have more idea regarding these cars it is best to dial the toll free customer care numbers.
Based in California, this is reportedly the only
tractor-trailer limo ever built. People will tell you afterward about things that happened and show you pictures
of scenes you’ll have absolutely no recollection of.

Bridget
10 years ago

Way cool! Some very valid points! I appreciate you writing this article and
the rest of the website is also very good.

Georgina
10 years ago

Hi this is somewhat of off topic but I was wanting to know if blogs use
WYSIWYG editors or if you have to manually code with HTML.
I’m starting a blog soon but have no coding expertise so I wanted to get guidance from someone with experience. Any help would be enormously appreciated!