CDI元件技術(一)

weixin_34279579發表於2016-11-20

最好的學習資料還是官方文件
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

相關文章