CDI组件技术(一)

最好的学习资料还是官方文档
http://docs.jboss.org/weld/reference/latest/en-US/html/
写的不好不要喷!

@Inject

功能:核心注解,根据组件类型向容器申请一个组件

我们定义一个接口类Greeting.java

public interface Greeting {
    public String greet(String name);
}

然后定义一个SimpleGreeting.java类实现这个接口

public class SimpleGreeting implements Greeting {
  public String greet(String name) {
    return name == null ? "welcome!" : "Hello " + name;
  }
}

GreetingController.java类中获取SimpleGreeting实例
一般是调用发生多态

Greeting simpleGreeting  = new SimpleGreeting() 

这样会出现不好的现象就是我们需要自己去管理这个组件的生命周期,所以我们可以通过CDI注解的方式来向容器请求一个组件,这个组件就是SimpleGreeting 类型的组件了

 @Inject
 Greeting greeting; 

再看看我们的JSF实现页面

 <h:body>
    <p style="font-size:16px"><h:outputText value="#{greetingController.sayHello()}"/></p>
    <p><h:outputText value="#{greetingController.username}" id="echoName"/></p>
    <h:form>
        <p:inputText value="#{greetingController.username}"/>
        <p:commandButton value="submit" ajax="false" update="echoName"/>
    </h:form>
</h:body>

如果有多个组件实现这个接口怎么办呢?
于是我们用到了第二个注解

@Qualifters

功能:区别组件,qualifter不是一个具体的标签而是对解释组件类注解的总称
比如我们定义FancyGreeting.java实现Greeting接口

@Fancy
public class FancyGreeting implements Greeting {
    public String greet(String name) {
        return "Nice to meet you, hello " + name;
    }
}

这个时候我们再想容器申请一个Greeting类型的组件就会出现错误,因为容器同时找到了两个满足条件的组件:SimpleGreetingFancyGreeting所以我们这个时候可以给其中一个组件添加一个qualifter来区别这个两个组件。
比如在FancyGreeting 类前添加@Fancy注解,这个就会生成一个qualifterFancy.java

@Qualifier
@Target({TYPE,METHOD,FIELD,PARAMETER})
@Retention(RUNTIME)
public @interface Fancy {  
}

这样如果我们需要调用Fancy组件只需

@Inject @Fancy  
Greeting fancyGreeting;

如果我们还是仍然需要调用SimpleGreeting 的话

@Inject
Greetting simpleGreeting

或则

@Inject @Default
Greetting simpleGreeting

看到这里大家应该明白了,如果一个组件没有添加qualifter那么他就有一个默认qualifter@Default
也就是说每次向容器申请一个组建的时候其实就是查询下面这张表

接口 实现类 Qualifter
Gretting SimpleGretting @Any @Default
FancyGreeting @Any @Fancy

@Any

就是每一个组件都必须有的注解

 @Inject @Any 
Instance<Greeting> greetings;

这样就可以申请一个组件数组!

示例代码:
https://github.com/liuqinyi/weld-tutorial
https://github.com/liuqinyi/quickstart.git

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 175,702评论 25 709
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,508评论 19 139
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 47,081评论 6 342
  • 原创文章转载请注明出处,谢谢 1.关于Mac OS Classic Mac OS Classic是Mac OSX在...
    北辰明阅读 8,833评论 1 5
  • 2017年8月3日 星期四 天气雨 颜颜合上电脑,这时候天色已经渐渐泛白,又一个崭新的,阳光明媚的黑夜吧...
    一玖酒八阅读 3,635评论 0 2