spring 的 qualifier 日常使用通常直接是使用id 来限定,不过spring给咱们提供了更强大的功能。java
@Qualifier
中限定bean的id@Qualifier
来指定后续使用的value
,而后在注入处使用指定的值Example:spring
public interface OrderService { String createOrder(String name); } @Component @Qualifier(value = "whatever") public class EmptyOrderService implements OrderService { private Logger logger = LoggerFactory.getLogger(EmptyOrderService.class); @Override public String createOrder(String name) { logger.info("empty order service " + name); return "empty"; } }
@Qualifier
除了能够注解在类上,属性上,还能够注解在 annotation上,这样咱们能够创造本身的qualifier(在xml里能够使用<qualifier>
)。app
Example: id 有时候不明确,咱们须要按本身的条件来创造qualifieride
@Target(value = {ElementType.TYPE, ElementType.METHOD, ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) @Inherited @Qualifier @Documented public @interface OrderQualifier { String orderName() default"default"; int orderType() default 0; }
而后就能够使用@OrderQualifier
来指定和注入bean了。测试
@Component @OrderQualifier(orderName = "kill", orderType = 2) public class KillOrderService implements OrderService { private Logger logger = LoggerFactory.getLogger(KillOrderService.class); @Override public String createOrder(String name) { logger.info("kill order service " + name); return "kill"; } } @Component @OrderQualifier(orderName = "normal", orderType = 1) public class NormalOrderService implements OrderService { private Logger logger = LoggerFactory.getLogger(NormalOrderService.class); @Override public String createOrder(String name) { logger.info("normal create order " + name); return "normal"; } }
使用时直接注入:code
@RestController @RequestMapping("order") public class OrderResource { @Autowired @OrderQualifier(orderName = "kill", orderType = 2) OrderService orderService; @Autowired @OrderQualifier(orderName = "normal", orderType = 1) OrderService normalOrderService; @Autowired @Qualifier("whatever") OrderService emptyOrderService; @GetMapping("kill") public String print(String name) { return orderService.createOrder(name); } @GetMapping("normal") public String normal(String name) { return normalOrderService.createOrder(name); } @GetMapping("empty") public String empty(String name) { return emptyOrderService.createOrder(name); } }
测试一下,分别调用回返回了各自的值。orm