最好的学习资料还是官方文档
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实现页面
如果有多个组件实现这个接口怎么办呢?
于是我们用到了第二个注解
@Qualifters
功能:区别组件,qualifter不是一个具体的标签而是对解释组件类注解的总称
比如我们定义FancyGreeting.java
实现Greeting
接口
@Fancy
public class FancyGreeting implements Greeting {
public String greet(String name) {
return "Nice to meet you, hello " + name;
}
}
这个时候我们再想容器申请一个Greeting类型的组件就会出现错误,因为容器同时找到了两个满足条件的组件:SimpleGreeting
和FancyGreeting
所以我们这个时候可以给其中一个组件添加一个qualifter
来区别这个两个组件。
比如在FancyGreeting
类前添加@Fancy
注解,这个就会生成一个qualifter
类Fancy.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 greetings;
这样就可以申请一个组件数组!
示例代码:
https://github.com/liuqinyi/weld-tutorial
https://github.com/liuqinyi/quickstart.git