Quarkus框架入門之二:依賴注入
前言
Spring框架最開始被我熟知就是AOP和IOC,其中IOC在開發過程中更是被廣泛使用,如果切換到一個新的框架沒有了依賴注入和控制反轉,那麼可以說一夜回到解放前了。那麼,Quarkus框架中有沒有對應的功能呢? 當然也有,Quarkus基於CDI規範提供了依賴注入的相關功能,本文將進行簡單介紹。
CDI-Contexts and Dependency Injection
簡單介紹
CDI(Contexts and Dependency Injection),即上下文依賴注入,是J2EE6釋出的一個標準規範,用於對上下文依賴注入的標準規範化,思想應該是來源於Spring的IOC,存在的年頭已經挺久遠。但是之前一直沒怎麼關注這個規範,都是用Spring Framework打天下。 以前以為只能在J2EE中使用,但是在寫這篇文章的時候,發現在J2SE8.0已經可以使用CDI了,只需要明確引導CDI容器即可。
簡單使用示例(J2SE)
以下以在一個簡單的Java專案中使用weld實現依賴注入進行簡單示例,依賴包如下:
<dependency>
<groupId>org.jboss.weld.se</groupId>
<artifactId>weld-se-core</artifactId>
<version>3.1.0.Final</version>
</dependency>
- 首先,編寫介面類和實現類;
HelloService.class
/**
* Created at 2019/5/18 by centychen<[email protected]>
*/
public interface HelloService {
/**
* example method.
*
* @return
*/
String sayHello();
}
HelloServiceImpl.class
import cn.centychen.examples.j2se.cdi.service.HelloService; import javax.enterprise.inject.Default; /** * Created at 2019/5/18 by centychen<[email protected]> */ @Default public class HelloServiceImpl implements HelloService { /** * Example method implement. * * @return */ @Override public String sayHello() { return "Hello,This is an example for CDI."; } }
- 其次,新增
beans.xml
定義檔案,內容如下: 實際上新增一個空白檔案也可以正常執行。
<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd" bean-discovery-mode="all">
</beans>
- 最後,編寫測試啟動類
import cn.centychen.examples.j2se.cdi.service.HelloService;
import javax.enterprise.inject.se.SeContainer;
import javax.enterprise.inject.se.SeContainerInitializer;
/**
* Created at 2019/5/18 by centychen<[email protected]>
*/
public class Application {
/**
* main method.
*
* @param args
*/
public static void main(String[] args) {
SeContainer container = SeContainerInitializer.newInstance().initialize();
HelloService helloService = container.select(HelloService.class).get();
System.out.println(helloService.sayHello());
}
}
- 執行測試,輸入日誌如下,HelloService的實現類已經正確注入。
objc[13831]: Class JavaLaunchHelper is implemented in both /Library/Java/JavaVirtualMachines/jdk1.8.0_111.jdk/Contents/Home/bin/java (0x10d96e4c0) and /Library/Java/JavaVirtualMachines/jdk1.8.0_111.jdk/Contents/Home/jre/lib/libinstrument.dylib (0x10e9934e0). One of the two will be used. Which one is undefined.
五月 18, 2019 12:37:36 下午 org.jboss.weld.bootstrap.WeldStartup <clinit>
INFO: WELD-000900: 3.1.0 (Final)
五月 18, 2019 12:37:36 下午 org.jboss.weld.bootstrap.WeldStartup startContainer
INFO: WELD-000101: Transactional services not available. Injection of @Inject UserTransaction not available. Transactional observers will be invoked synchronously.
五月 18, 2019 12:37:37 下午 org.jboss.weld.environment.se.WeldContainer fireContainerInitializedEvent
INFO: WELD-ENV-002003: Weld SE container 3f7714f9-0cea-48a0-b217-1147420967e0 initialized
Hello,This is an example for CDI.
Weld SE container 3f7714f9-0cea-48a0-b217-1147420967e0 shut down by shutdown hook
Quarkus依賴注入
Quarkus的依賴注入管理使用的是io.quarkus:arc
,實際上就是CDI的一種實現。以下上一篇文章示例進行簡單改造,實現依賴注入。
- 編寫業務介面HelloService及其實現類HelloServiceImpl,參考程式碼如下:
HelloService.class:
/**
* Created at 2019/5/18 by centychen<[email protected]>
*/
public interface HelloService {
/**
* Say hello method.
*
* @param name
* @return
*/
String sayHello(String name);
}
HelloServiceImpl.class:
import cn.centychen.quarkus.example.service.HelloService;
import javax.enterprise.context.ApplicationScoped;
import javax.enterprise.inject.Default;
/**
* Created at 2019/5/18 by centychen<[email protected]>
*/
@ApplicationScoped //標誌Bean的作用域為一個應用一個例項。
@Default //預設,介面多實現時必須
public class HelloServiceImpl implements HelloService {
@Override
public String sayHello(String name) {
return String.format("Hello,%s!", name);
}
}
- 改造GreetingResource類,增加依賴注入以及業務介面呼叫,參考如下:
import cn.centychen.quarkus.example.service.HelloService;
import javax.inject.Inject;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.CompletionStage;
/**
* @author: cent
* @email: [email protected]
* @date: 2019/5/4.
* @description:
*/
@Path("/hello")
public class GreetingResource {
@Inject
private HelloService helloService;
@GET
@Produces(MediaType.APPLICATION_JSON)
@Path("/{name}")
public CompletionStage<String> hello(@PathParam("name") String name) {
//使用非同步響應
return CompletableFuture.supplyAsync(() -> helloService.sayHello(name));
}
}
- 啟動應用,訪問介面,返回如下,證明依賴注入已經成功:
總結
Quarkus的上下文依賴注入使用的是CDI標準規範,實現依賴注入可以避免從Spring框架切換到Quarkus框架的使用上的不習慣,因為本人還沒特別深入地使用Quarkus框架,特別是並沒有在真實生產環境中使用過Quarkus框架,所以說Quarkus Arc能否達到Spring IOC的高度,還需要時間驗證。
示例原始碼
參考文章
- CDI(JSR 299)介紹——JavaEE平臺的上下文與依賴注入
- An Introduction to CDI
-
相關推薦
Quarkus框架入門之二:依賴注入
前言 Spring框架最開始被我熟知就是AOP和IOC,其中IOC在開發過程中更是被廣泛使用,如果切換到一個新的框架沒有了依賴注入
Quarkus框架入門之三:Quarkus與Spring Boot啟動效能對比
開篇 為什麼要從安逸的Spring全家桶切換到Quarkus框架呢?Quarkus有什麼優勢?除了能夠編譯成Native Appl
SpringBoot 入門之二:獲取Properties中的值,通過類配置來替代原SpringXML的配值和注入方式
•application.properties •application.yml person.last-name=\u674E\u56DB person.age=12 person.birth=2017/12/15 person.boss=false person.maps.k
Labview入門之二:認識基本控件
四種 定義 加粗 輸入 面板 操作 設置 http 重新 上一節簡單的介紹了如何新建一個簡單的VI,從中我們可以看到前面板上都是由控件選板上的控件添加的,這一節將會介紹這些基本的控件。打開控件選板(鼠標右鍵點擊前面板的空白處或者“查看”->"控件選板")。 1 數值控
TensorFlow入門之二:tensorflow手寫數字識別
一、基礎知識 基礎知識可以跳過,可以直接看後面的程式碼實現 MNIST資料集 MNIST資料集的官網是Yann LeCun’s website。可以使用下面的python程式碼自動下載資料集。 #已經下載input_data.py #import input_data #沒有
Godot3遊戲引擎入門之二:第一個簡單的遊戲場景
一、前言 最近工作時間安排地非常緊湊,除了週日一天,已經沒有其他空閒時間了。不過到了 10 月份會慢慢恢復,目前我在抽出一點時間好好準備這個 Godot 系列,邊寫邊學習邊迎接Godot 3.1 版本的到來,也算是一件高興地事情,哈哈。 :sunglasses:
SpringMVC入門之二:配置及啟用SpringMVC(基於JAVA配置)
為了方便理解和簡化無關細節,我們要使用最簡單的方式來配置SpringMVC:所要實現的功能僅限於執行我們所建立的控制器。 配置DispatcherServlet DispatcherServlet是SpringMVC的核心。在這裡請求會第一次接觸到框架,它要負責將請求路由
Spring框架基礎(二)——依賴注入DI/IOC
一,手動進行值注入(bean) <!-- 例項化類時,呼叫類中屬性的set方法並將值傳給形參 --> <bean name="bookinfo" class="com.lanou.fuxi.domain.Bookinfo"&
數獨高階技巧入門之二:簡單的單數鏈結構——雙強鏈
著作權 images div urb apt 藍色 刪除 作者 技巧 ?如果在數獨盤勢中,我們找到關於某個候選數的兩條強鏈,且這兩條強鏈的一側在同一單元(行、列、宮)內,稱為base,另一側有共同作用格,稱為cover。根據前篇《鏈及其簡單應用》中的定義,base側兩端
JSON入門之二:org.json的基本用法
java中用於解釋json的主流工具有org.json、json-lib與gson,本文介紹org.json的應用。 官方文件: 1、主要類 Classes A dense indexed sequence of values. A modifiab
spring框架學習(二)依賴注入
spring框架為我們提供了三種注入方式,分別是set注入,構造方法注入,介面注入。介面注入不作要求,下面介紹前兩種方式。 1,set注入 採用屬性的set方法進行初始化,就成為set注
Spark 入門之二:Spark RDD詳解
RDD的容錯機制實現分散式資料集容錯方法有兩種:資料檢查點和記錄更新RDD採用記錄更新的方式:記錄所有更新點的成本很高。所以,RDD只支援粗顆粒變換,即只記錄單個塊上執行的單個操作,然後建立某個RDD的變換序列(血統)儲存下來;變換序列指,每個RDD都包含了他是如何由其他RDD變換過來的以及如何重建某一塊資料
JTopo 框架教程之二:節點連線
效果展示: JTopo 框架學習案列之二:節點連線 相關說明:相關注釋已經標註在程式碼中。 <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8">
objective-c runtime安全措施之二:反注入
《O'Reilly.Hacking.and.Securing.iOS.Applications>>讀書筆記 反注入:在類函式被呼叫前做完整性檢測(預防應用自定義函式或apple標準庫函式被修改或替換) 原理:呼叫dladdr()函式檢查類方法的基本資訊是否合法
《逐夢旅程:Windows遊戲編程之從零開始》學習筆記之二:GDI框架
register 開發 操作 程序 turn use 繪制 cal 完整 1 //===========================================【程序說明】=================================== 2 //
CMake系列之二:入門案例-單個源文件
bubuko 源文件 註釋 http 編寫 AD 源碼 power 比較 編寫一個源碼文件 如下 1 #include<stdio.h> 2 #include<stdlib.h> 3 4 double power(double
Memcached學習筆記之二:入門使用
使用 現在伺服器已經正常運行了,下面我們就來寫java的客戶端連線程式。 將java_memcached-release.zip解壓,把java_memcached-release.jar檔案複製到java專案的lib目錄下, 然後我們來編寫程式碼,比如我提供的一個應用類如下: &n
雜湊學習演算法之二:基於hash的ANN框架
在上一節瞭解了ANN的背景,簡單介紹了hash的演算法,那基於hash的ANN框架是怎樣的呢? 框架圖 框架說明 基於hash的ANN主要有四個步驟,包括特徵提取、hash編碼(學習+編碼)、漢明距離排序、重排序。 1、特徵提取 有查詢影象和影象資料庫,需要對這兩類分別
Docker入門系列之二:使用dockerfile製作包含指定web應用的映象
實現題目描述的這個需求有很多種辦法,作為入門,讓我們從最簡單的辦法開始。 首先使用命令docker ps確保當前沒有正在執行的Docker例項。 執行命令docker run -it nginx: 然後我們另外開一個終端,用docker ps命令檢視這個執行起來的容器例項,Status的Up 54 s
Docker系列之二:Docker 入門
啟動和停止Docker 服務 sudo service docker stop systemctl stop docker.service sudo service docker start systemctl start docker.service 檢視docker