Tuesday, 11 April 2017

Spring: Resolve autowiring conflict using primary attribute

If there are multiple beans available for the same type, spring don't know which bean to inject. You need to specify which bean to take, when more than one bean of same type are available. By using @Primary annotation (or) primary attribute, you can achieve this.

Example
 <bean id="osho" class="com.sample.pojo.Author" primary="true">
  <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">
  <property name="firstName" value="Hari Krishna" />
  <property name="lastName" value="Gurram" />
  <property name="dateOfBirth" value="05 may 1989" />
  <property name="country" value="India" />
 </bean>
Out of above two beans, I added primary attribute to the bean with id 'osho', spring always use the bean with id 'osho' in case of conflict.

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();
 }

}


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">
  <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">
  <property name="firstName" value="Hari Krishna" />
  <property name="lastName" value="Gurram" />
  <property name="dateOfBirth" value="05 may 1989" />
  <property name="country" value="India" />
 </bean>

</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" });

  Author author1 = context.getBean(Author.class);
  Author author2 = context.getBean(Author.class);
  Author author3 = context.getBean(Author.class);

  System.out.println(author1);
  System.out.println(author2);
  System.out.println(author3);

  ((ClassPathXmlApplicationContext) context).close();
 }
}

Output

Author [firstName=Chandra Mohan, lastName=Jain, dateOfBirth=11 December 1931, country=India]
Author [firstName=Chandra Mohan, lastName=Jain, dateOfBirth=11 December 1931, country=India]
Author [firstName=Chandra Mohan, lastName=Jain, dateOfBirth=11 December 1931, country=India]


Previous                                                 Next                                                 Home

No comments:

Post a Comment