Spring @Qualifier Annotation

In previous chapter, In @Autowired annotation, The @Autowired annotation is auto wire the bean by matching data type if spring container find more than one beans same data type then it find by name. Suppose if by name it is not find any bean, then what will be do for wiring a bean from dependency injection?

So for avoid this type problem we can use the one more annotation @Qualifier along with the @Autowired annotation remove the confusion by specifying which exact bean will be wired. 
 Below is an example to show the use of @Qualifier annotation.

Circle.java
package com.dineshonjava.sdnext.autowiredannotation.tutorial;

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

public class Circle
{ 
 private Point center;
 //using autowired annotation with setter method
//using qualifier annotation for exact bean will be wired
 @Autowired
 @Qualifier("circleBean")
 public void setCenter(Point center) 
 {
    this.center = center;
 }

 public void draw() 
 {
System.out.println("Circle is drawn of center ("+center.getX()+", "+center.getY()+")");
 }
}
Point.java
package com.dineshonjava.sdnext.autowiredannotation.tutorial;

public class Point
{
 private int x;
 private int y;
 /**
  * @return the x
  */
 public int getX() {
  return x;
 }
 /**
  * @param x the x to set
  */
 public void setX(int x) {
  this.x = x;
 }
 /**
  * @return the y
  */
 public int getY() {
    return y;
 }
 /**
  * @param y the y to set
  */
 public void setY(int y) {
           this.y = y;
 }
}
DrawingApp.java
package com.dineshonjava.sdnext.autowiredannotation.tutorial;

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

/**
 * @author Dinesh Rajput
 *
 */
public class DrawingApp
{
 /**
  * @param args
  */
 public static void main(String[] args) 
 {
ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
Circle circle = (Circle) context.getBean("circle");
circle.draw();
 }
}
spring.xml
<beans xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p" xmlns:security="http://www.springframework.org/schema/security" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xsi:schemalocation="http://www.springframework.org/schema/beans">
  
<bean class="com.dineshonjava.sdnext.autowiredannotation.tutorial.Circle" id="circle">
</bean>
  
<bean class="com.dineshonjava.sdnext.autowiredannotation.tutorial.Point" id="pointA">
   <qualifier value="circleBean"></qualifier>
   <property name="x" value="0"></property>
   <property name="y" value="0"></property>
</bean>
  
<bean class="com.dineshonjava.sdnext.autowiredannotation.tutorial.Point" id="pointB">
   <property name="x" value="-20"></property>
   <property name="y" value="0"></property>
</bean>
  
<bean class="com.dineshonjava.sdnext.autowiredannotation.tutorial.Point" id="pointC">
   <property name="x" value="20"></property>
   <property name="y" value="0"></property>
</bean> 
  
<bean class="com.dineshonjava.sdnext.autowiredannotation.tutorial.Point" id="center">
   <property name="x" value="10"></property>
   <property name="y" value="10"></property>
</bean>
<context:annotation-config></context:annotation-config>
</beans>

Once you are done with creating source and bean configuration files, let us run the application. If everything is fine with your application, this will print the following message:

Output:
Jul 11, 2012 11:23:36 PM org.springframework.context.support.AbstractApplicationContext prepareRefresh
INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@ab50cd: startup date [Wed Jul 11 23:23:36 IST 2012]; root of context hierarchy
Jul 11, 2012 11:23:36 PM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
INFO: Loading XML bean definitions from class path resource [spring.xml]
Jul 11, 2012 11:23:36 PM org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons
INFO: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@bd928a: defining beans [circle,pointA,pointB,pointC,center,org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,org.springframework.context.annotation.ConfigurationClassPostProcessor$ImportAwareBeanPostProcessor#0]; root of factory hierarchy
Circle is drawn of center (0, 0)


<< Introduction to Annotations in Spring |index| Spring @Aspect Annotation>>



No comments:

Post a Comment