Close

Spring - Resolving ambiguity by using @Inject and @Named annotations

[Last Updated: Nov 30, 2020]

In the last example we saw how to use JSR 330 javax.inject.Inject annotation (in the place of @Autowire). Spring also supports javax.inject.Named annotation (also defined in JSR 330) to qualify a name for the dependency. That means we can use @Named annotation in the place of @Qualifier annotation.

Example

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 and @Named annotations

package com.logicbig.example;

import javax.inject.Inject;
import javax.inject.Named;
import java.util.Arrays;

public class OrderServiceClient {

  @Inject
  @Named("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 the example app

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-inject-and-named-annotations-example Select All Download
  • spring-inject-and-named-annotations-example
    • src
      • main
        • java
          • com
            • logicbig
              • example
                • OrderServiceClient.java

    See Also