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型別的元件就會出現錯誤,因為容器同時找到了兩個滿足條件的元件: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<Greeting> greetings;
這樣就可以申請一個元件陣列!
示例程式碼:
https://github.com/liuqinyi/weld-tutorial
https://github.com/liuqinyi/quickstart.git
相關文章
- 談元件技術(一) 必備知識. (轉)元件
- 元件技術的本質COM例項分析一 (轉)元件
- JAVA CDI @Inject基本用法Java
- 開源元件DoraemonKit之Android版本技術實現(一)元件Android
- Android技術棧(二)元件化改造Android元件化
- 得物技術登入元件重構元件
- 技術面試(一)面試
- 視覺化拖拽元件庫一些技術要點原理分析視覺化元件
- JAVA CDI 學習- @Produces及@DisposesJava
- 聊聊技術管理(一)入行之技術管理和技術專家
- Mozilla Firefox開始支援Web元件技術FirefoxWeb元件
- 視覺化拖拽元件庫一些技術要點原理分析(二)視覺化元件
- 一點技術思考
- kubernetes container device interface (CDI)AIdev
- 前端技術演進(一):Web前端技術基礎前端Web
- .NET框架-Winform技術中元件被容器引用陷阱框架ORM元件
- web技術分享| 基於vue3實現自己的元件庫,第一章:Message元件WebVue元件
- web server apache tomcat11-33-CDIWebServerApacheTomcat
- 負載均衡技術(一)———負載均衡技術介紹負載
- 容器技術之Dockerfile (一)Docker
- DEP緩解技術(一)
- Oracle技術基礎(一)Oracle
- 轉:Java同步技術 (一)Java
- Frameset 兩頁面互調控制元件技術案例控制元件
- 小程式的小元件技術能力和場景解析元件
- 技術戰疫:下一個10年的技術趨勢
- 「 ThoughtWorks面試 —— 一次愉快的技術交流 | 掘金技術徵文」面試
- 給技術人員一些技術以外的建議
- Flutter進階: 帶你實現一個 海拔圖 控制元件(上篇) | 掘金技術徵文Flutter控制元件
- 一半技術一半生活
- 虛擬化技術概述(一)
- 常用的Websocket技術一覽Web
- ELK技術棧實踐(一)
- 技術顧問認知(一)
- 技術管理者系列(一)
- 《容器技術系列》一2.1 引言
- iOS面試題一(技術類)iOS面試題
- 技術問答集錦(一)