Close

Spring - Resolving ambiguity by using @Resource

[Last Updated: Dec 5, 2020]

Spring supports Java SE Common Annotations (JSR-250). That means, we can use @Resource instead of using the combination of @Autowire and @Qualifier.




Example

package com.logicbig.example.service;

public interface OrderService {

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

import com.logicbig.example.service.OrderService;

public class OrderServiceImpl1 implements OrderService {

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

import com.logicbig.example.service.OrderService;

public class OrderServiceImpl2 implements OrderService {

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

Using @Resource at injection point

package com.logicbig.example.client;

import com.logicbig.example.service.OrderService;
import javax.annotation.Resource;
import java.util.Arrays;

public class OrderServiceClient {

  @Resource(name = "OrderServiceA")
  private OrderService orderService;

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

Defining beans and running app

package com.logicbig.example;

import com.logicbig.example.client.OrderServiceClient;
import com.logicbig.example.service.OrderService;
import com.logicbig.example.service.impl.OrderServiceImpl1;
import com.logicbig.example.service.impl.OrderServiceImpl2;
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 1, for order id=100
Order details from impl 1, for order id=200
Order details from impl 1, for order id=300

Note that @Resource can also be used without specifying any name (the qualifier) parameter. If no name is specified explicitly, the default name is derived from the field name or setter method.



Example Project

Dependencies and Technologies Used:

  • Spring Context 4.2.3.RELEASE: Spring Context.
  • JDK 1.8
  • Maven 3.6.3

Spring - @Resource Example Select All Download
  • spring-resource-example
    • src
      • main
        • java
          • com
            • logicbig
              • example
                • client
                • service
                  • impl
                • AppRunner.java

    See Also