In the last example we saw how to use JSR 330 javax.inject.Inject (or jakarta.inject.Inject with Spring 6+) annotation in the place of @Autowire . Spring also supports javax.inject.Named (or jakarta.inject.Named with Spring 6+) 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 jakarta.inject.Inject;
import jakarta.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();
}
}
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
|