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实现页面

 
    

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

@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 greetings;

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

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

你可能感兴趣的:(CDI组件技术(一))