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