Spring supports annotations specified by JSR 330 (Dependency Injection for Java). That means we can use javax.inject.Inject (or jakarta.inject.Inject with Spring 6+) annotation along with @Qualifier annotation to resolve ambiguity.
Example
pom.xml<dependency>
<groupId>jakarta.inject</groupId>
<artifactId>jakarta.inject-api</artifactId>
<version>2.0.0</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 jakarta.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();
}
}
OutputOrder 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 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.inject-api 2.0.0 (Jakarta Dependency Injection)
- JDK 17
- Maven 3.8.1
|