Close

Spring - Resolving ambiguity by using @Inject and @Qualifier Annotations

[Last Updated: Nov 30, 2020]

Spring supports annotations specified by JSR 330 (Dependency Injection for Java). That means we can use javax.inject.Inject annotation along with @Qualifier annotation to resolve ambiguity.

Example

pom.xml

<dependency>
   <groupId>javax.inject</groupId>
   <artifactId>javax.inject</artifactId>
   <version>1</version>
</dependency>

Bean classes

package com.logicbig.example;

public interface OrderService {

  String getOrderDetails(String orderId);
}
package com.logicbig.example;

public class OrderServiceImpl1 implements OrderService {

  public String getOrderDetails (String orderId) {
      return "Order details from impl 1, for order id=" + orderId;
  }
}
package com.logicbig.example;

public class OrderServiceImpl2 implements OrderService {

  public String getOrderDetails (String orderId) {
      return "Order details from impl 2, for order id=" + orderId;
  }
}

Using @Inject annotation

package com.logicbig.example;

import org.springframework.beans.factory.annotation.Qualifier;
import javax.inject.Inject;
import java.util.Arrays;

public class OrderServiceClient {

  @Inject
  @Qualifier("OrderServiceB")
  private OrderService orderService;

  public void showPendingOrderDetails() {
      for (String orderId : Arrays.asList("100", "200", "300")) {
          System.out.println(orderService.getOrderDetails(orderId));
      }
  }
}

Defining beans and running example application

package com.logicbig.example;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class AppRunner {
  @Bean(name = "OrderServiceA")
  public OrderService orderServiceByProvider1() {
      return new OrderServiceImpl1();
  }

  @Bean(name = "OrderServiceB")
  public OrderService orderServiceByProvider2() {
      return new OrderServiceImpl2();
  }

  @Bean
  public OrderServiceClient createClient() {
      return new OrderServiceClient();
  }

  public static void main(String... strings) {
      AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppRunner.class);
      OrderServiceClient bean = context.getBean(OrderServiceClient.class);
      bean.showPendingOrderDetails();
  }
}

Output

Order details from impl 2, for order id=100
Order details from impl 2, for order id=200
Order details from impl 2, for order id=300

Example Project

Dependencies and Technologies Used:

  • spring-context 4.2.3.RELEASE: Spring Context.
  • javax.inject 1: The javax.inject API.
  • JDK 1.8
  • Maven 3.6.3

Spring - Using @Inject + @Qualifier Select All Download
  • spring-inject-and-qualifier-annotations-example
    • src
      • main
        • java
          • com
            • logicbig
              • example
                • OrderServiceClient.java

    See Also