@qualifier,@autowired vs @ @inject

n Spring, @Qualifier means, which bean is qualify to autowired on a field. See following scenario :

Autowiring Example

See below example, it will autowired a “person” bean into customer’s person property.
package com.mkyong.common;

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

public class Customer {

 @Autowired
 private Person person;
 //...
}
But, two similar beans “com.mkyong.common.Person” are declared in bean configuration file. Will Spring know which person bean should autowired?
<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="customer" class="com.mkyong.common.Customer" />

 <bean id="personA" class="com.mkyong.common.Person" >
  <property name="name" value="mkyongA" />
 </bean>

 <bean id="personB" class="com.mkyong.common.Person" >
  <property name="name" value="mkyongB" />
 </bean>

</beans>
When you run above example, it hits below exception :
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException:
 No unique bean of type [com.mkyong.common.Person] is defined:
  expected single matching bean but found 2: [personA, personB]

@Qualifier Example

To fix above problem, you need @Quanlifier to tell Spring about which bean should autowired.
package com.mkyong.common;

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

public class Customer {

 @Autowired
 @Qualifier("personA")
 private Person person;
 //...
}
In this case, bean “personA” is autowired.
Customer [person=Person [name=mkyongA]]
@ Autowired vs @Inject

To handle the situation in which there is no wiring, beans are available with @Autowired required attribute set to false.

But when using @Inject, the Provider interface works with the bean which means that the bean is not injected directly but with the Provider.



@Inject has no 'required' attribute


Annotations @Inject and @Autowired- is almost complete analogies. As well as @Autowired annotation, @Inject annotation can be used for automatic binding properties, methods, and constructors.

In contrast to @Autowired annotation, @Inject annotation has no required attribute. Therefore, if the dependencies will not be found - will be thrown exception.

Comments