专栏首页dylanliuSpring Qualifier的使用

Spring Qualifier的使用

摘要

spring 的 qualifier 平常使用一般直接是使用id 来限定,不过spring给我们提供了更强大的功能。

使用方法

直接使用

  • 直接在@Qualifier中限定bean的id
  • 在bean上使用@Qualifier来指定后续使用的value,然后在注入处使用指定的值

Example:

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>)。

Example: id 有时候不明确,我们需要按自己的条件来创造qualifier

@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";
    }
}

使用时直接注入:

@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);
    }
}

测试一下,分别调用回返回了各自的值。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 设计原则之里氏替换原则(LSP)

    里氏替换原则是在做继承设计时需要遵循的原则,不遵循了 LSP 的继承类会带来意想不到的问题。

    Dylan Liu
  • 单元测试的思考与实践

    刚开始工作的时候对单元测试是一种神秘主义,觉得测试很好,但不知道如何开始。团队里也没人去写单元测试,偶尔有个也是写的集成测试,用Spring的test,将所有依...

    Dylan Liu
  • 设计模式之备忘录模式

    备忘录模式(Momento Pattern):在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后当需要时能将该对象恢复到原先保...

    Dylan Liu
  • java8 Lambda尝尝鲜

    转载:猿天地 链接:http://cxytiandi.com/blog/detail/2196 java8都已经发布这么久了,一直没来得及使用,线上环境基本...

    猿天地
  • Java基础巩固——反射

    什么是反射 ----    反射机制就是指程序运行时能够获取自身的信息。在Java中,只要给出类的名字,就可以通过反射机制来获取类的信息 哪里用的到反射机制 -...

    Janti
  • 简单介绍ASM核心API

    它的调用顺序是首先调用 visit,然后是对 visitSource 的最多一个调用,接下来是对 visitOuterClass 的最多一个调用,然后是可按任意...

    提莫队长
  • Java单体应用 - 架构模式 - 03.设计模式-18.中介者模式

    原文地址:http://www.work100.net/training/monolithic-architecture-design-patterns-med...

    光束云
  • Java泛型学习

    1、泛型的概念     泛型即“参数化类型”,就比如我们定义方法的时候,定义一个变量,称为形参,变量值根据传进去的实参的值不同而改变。而泛型的出现,就是为了解决...

    JMCui
  • Effective Java-嵌套类(内部类)

    嵌套类(nested class)是指被定义在另一个类内部的类。嵌套类的存在目的应该只是为外围类(enclosing class)提供服务。嵌套类有四种:

    用户2146693
  • 你知道@RequestMapping的name属性有什么用吗?带你了解URI Builder模式(UriComponents/UriComponentsBuilder)【享学Spring MVC】

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

    BAT的乌托邦

扫码关注云+社区

领取腾讯云代金券