Spring supports Java JSR-250 annotations. 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 jakarta.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();
}
}
OutputOrder 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 ProjectDependencies and Technologies Used: - spring-context 6.1.2 (Spring Context)
Version Compatibility: 3.2.3.RELEASE - 6.1.2 Version compatibilities of spring-context with this example: Versions in green have been tested.
- jakarta.jakartaee-api 10.0.0 (Eclipse Foundation)
- JDK 17
- Maven 3.8.1
|