In
my previous post, I explained how @primary annotation is used in autowiring by
type with several instances when one primary candidate can be determined. But
when you require more control over the selection process, you should use
@Qualifier annotation.
<bean id="osho" class="com.sample.pojo.Author" primary="true"> <qualifier value="primaryBean" /> <property name="firstName" value="Chandra Mohan" /> <property name="lastName" value="Jain" /> <property name="dateOfBirth" value="11 December 1931" /> <property name="country" value="India" /> </bean> <bean id="Krishna" class="com.sample.pojo.Author"> <qualifier value="secondaryBean" /> <property name="firstName" value="Hari Krishna" /> <property name="lastName" value="Gurram" /> <property name="dateOfBirth" value="05 may 1989" /> <property name="country" value="India" /> </bean>
Notify
above snippet, I added qualifier tag to the beans 'osho' and 'Krishna'. Now I
can refer these beans using the qualifier name like below.
public class QualifierDemo { @Autowired @Qualifier("primaryBean") private Author author1; @Autowired @Qualifier("secondaryBean") private Author author2; }
Following
is the complete working application.
Author.java
package com.sample.pojo; public class Author { private String firstName; private String lastName; private String dateOfBirth; private String country; public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } public String getDateOfBirth() { return dateOfBirth; } public void setDateOfBirth(String dateOfBirth) { this.dateOfBirth = dateOfBirth; } public String getCountry() { return country; } public void setCountry(String country) { this.country = country; } @Override public String toString() { StringBuilder builder = new StringBuilder(); builder.append("Author [firstName=").append(firstName).append(", lastName=").append(lastName) .append(", dateOfBirth=").append(dateOfBirth).append(", country=").append(country).append("]"); return builder.toString(); } }
QualifierDemo.java
package com.sample.test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import com.sample.pojo.Author; public class QualifierDemo { @Autowired @Qualifier("primaryBean") private Author author1; @Autowired @Qualifier("secondaryBean") private Author author2; public Author getAuthor1() { return author1; } public void setAuthor1(Author author1) { this.author1 = author1; } public Author getAuthor2() { return author2; } public void setAuthor2(Author author2) { this.author2 = author2; } }
myConfiguration.xml
<?xml version="1.0" encoding="UTF-8"?> <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.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <context:annotation-config /> <bean id="osho" class="com.sample.pojo.Author" primary="true"> <qualifier value="primaryBean" /> <property name="firstName" value="Chandra Mohan" /> <property name="lastName" value="Jain" /> <property name="dateOfBirth" value="11 December 1931" /> <property name="country" value="India" /> </bean> <bean id="Krishna" class="com.sample.pojo.Author"> <qualifier value="secondaryBean" /> <property name="firstName" value="Hari Krishna" /> <property name="lastName" value="Gurram" /> <property name="dateOfBirth" value="05 may 1989" /> <property name="country" value="India" /> </bean> <bean id="qualifierDemo" class="com.sample.test.QualifierDemo" /> </beans>
HelloWorld.java
package com.sample.test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.sample.pojo.Author; public class HelloWorld { public static void main(String args[]) { ApplicationContext context = new ClassPathXmlApplicationContext(new String[] { "myConfiguration.xml" }); QualifierDemo demoObj = context.getBean("qualifierDemo", QualifierDemo.class); Author author1 = demoObj.getAuthor1(); Author author2 =demoObj.getAuthor2(); System.out.println("author1 = " + author1); System.out.println("author2 = " + author2); ((ClassPathXmlApplicationContext) context).close(); } }
Output
author1 = Author [firstName=Chandra Mohan, lastName=Jain, dateOfBirth=11 December 1931, country=India] author2 = Author [firstName=Hari Krishna, lastName=Gurram, dateOfBirth=05 may 1989, country=India]
The
@Qualifier annotation can also be specified on individual constructor arguments
or method parameters:
Example
@Autowired public void setAuthor1(@Qualifier("primaryBean") Author author) { this.author1 = author; } @Autowired public void setAuthor2(@Qualifier("secondaryBean") Author author) { this.author2 = author; }
Update
‘QualifierDemo’ class like below and re run HelloWorld.java application, you
can able to see same output.
QualifierDemo.java
package com.sample.test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import com.sample.pojo.Author; public class QualifierDemo { private Author author1; private Author author2; public Author getAuthor1() { return author1; } public Author getAuthor2() { return author2; } @Autowired public void setAuthor1(@Qualifier("primaryBean") Author author) { this.author1 = author; } @Autowired public void setAuthor2(@Qualifier("secondaryBean") Author author) { this.author2 = author; } }
No comments:
Post a Comment