Quarkus框架入門之二:依賴控制

前言

Spring框架最開始被我熟知就是AOP和IOC昵观,其中IOC在開發(fā)過程中更是被廣泛使用晾腔,如果切換到一個新的框架沒有了依賴注入和控制反轉(zhuǎn),那么可以說一夜回到解放前了啊犬。那么灼擂,Quarkus框架中有沒有對應(yīng)的功能呢?
當(dāng)然也有觉至,Quarkus基于CDI規(guī)范提供了依賴注入的相關(guān)功能剔应,本文將進(jìn)行簡單介紹。

CDI-Contexts and Dependency Injection

簡單介紹

CDI(Contexts and Dependency Injection)语御,即上下文依賴注入峻贮,是J2EE6發(fā)布的一個標(biāo)準(zhǔn)規(guī)范,用于對上下文依賴注入的標(biāo)準(zhǔn)規(guī)范化应闯,思想應(yīng)該是來源于Spring的IOC纤控,存在的年頭已經(jīng)挺久遠(yuǎn)。但是之前一直沒怎么關(guān)注這個規(guī)范孽锥,都是用Spring Framework打天下嚼黔。
以前以為只能在J2EE中使用,但是在寫這篇文章的時候惜辑,發(fā)現(xiàn)在J2SE8.0已經(jīng)可以使用CDI了唬涧,只需要明確引導(dǎo)CDI容器即可。

簡單使用示例(J2SE)

以下以在一個簡單的Java項(xiàng)目中使用weld實(shí)現(xiàn)依賴注入進(jìn)行簡單示例盛撑,依賴包如下:

<dependency>
            <groupId>org.jboss.weld.se</groupId>
            <artifactId>weld-se-core</artifactId>
            <version>3.1.0.Final</version>
        </dependency>
  • 首先碎节,編寫接口類和實(shí)現(xiàn)類;

HelloService.class

/**
 * Created at 2019/5/18 by centychen<292462859@qq.com>
 */
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<292462859@qq.com>
 */
@Default
public class HelloServiceImpl implements HelloService {

    /**
     * Example method implement.
     *
     * @return
     */
    @Override
    public String sayHello() {
        return "Hello,This is an example for CDI.";
    }
}
  • 其次抵卫,添加beans.xml定義文件狮荔,內(nèi)容如下:
    實(shí)際上添加一個空白文件也可以正常運(yùn)行。
<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<292462859@qq.com>
 */
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());
    }
}
  • 運(yùn)行測試殖氏,輸入日志如下,HelloService的實(shí)現(xiàn)類已經(jīng)正確注入姻采。
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雅采,實(shí)際上就是CDI的一種實(shí)現(xiàn)。以下上一篇文章示例進(jìn)行簡單改造,實(shí)現(xiàn)依賴注入婚瓜。

  • 編寫業(yè)務(wù)接口HelloService及其實(shí)現(xiàn)類HelloServiceImpl宝鼓,參考代碼如下:

HelloService.class:

/**
 * Created at 2019/5/18 by centychen<292462859@qq.com>
 */
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<292462859@qq.com>
 */
@ApplicationScoped //標(biāo)志Bean的作用域?yàn)橐粋€應(yīng)用一個實(shí)例。
@Default //默認(rèn)巴刻,接口多實(shí)現(xiàn)時必須
public class HelloServiceImpl implements HelloService {
    @Override
    public String sayHello(String name) {
        return String.format("Hello,%s!", name);
    }
}
  • 改造GreetingResource類愚铡,增加依賴注入以及業(yè)務(wù)接口調(diào)用,參考如下:
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: chenzhao@viomi.com.cn
 * @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) {
        //使用異步響應(yīng)
        return CompletableFuture.supplyAsync(() -> helloService.sayHello(name));
    }
}
  • 啟動應(yīng)用胡陪,訪問接口沥寥,返回如下,證明依賴注入已經(jīng)成功:


    image.png

總結(jié)

Quarkus的上下文依賴注入使用的是CDI標(biāo)準(zhǔn)規(guī)范督弓,實(shí)現(xiàn)依賴注入可以避免從Spring框架切換到Quarkus框架的使用上的不習(xí)慣营曼,因?yàn)楸救诉€沒特別深入地使用Quarkus框架,特別是并沒有在真實(shí)生產(chǎn)環(huán)境中使用過Quarkus框架愚隧,所以說Quarkus Arc能否達(dá)到Spring IOC的高度蒂阱,還需要時間驗(yàn)證。

示例源碼

參考文章

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末狂塘,一起剝皮案震驚了整個濱河市录煤,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌荞胡,老刑警劉巖妈踊,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異泪漂,居然都是意外死亡廊营,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進(jìn)店門萝勤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來露筒,“玉大人,你說我怎么就攤上這事敌卓∩魇剑” “怎么了?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵趟径,是天一觀的道長瘪吏。 經(jīng)常有香客問我,道長蜗巧,這世上最難降的妖魔是什么掌眠? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮幕屹,結(jié)果婚禮上扇救,老公的妹妹穿的比我還像新娘刑枝。我一直安慰自己,他們只是感情好迅腔,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著靠娱,像睡著了一般沧烈。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上像云,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天锌雀,我揣著相機(jī)與錄音,去河邊找鬼迅诬。 笑死腋逆,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的侈贷。 我是一名探鬼主播惩歉,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼俏蛮!你這毒婦竟也來了撑蚌?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤搏屑,失蹤者是張志新(化名)和其女友劉穎争涌,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體辣恋,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡亮垫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了伟骨。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片饮潦。...
    茶點(diǎn)故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖底靠,靈堂內(nèi)的尸體忽然破棺而出害晦,到底是詐尸還是另有隱情,我是刑警寧澤暑中,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布壹瘟,位于F島的核電站,受9級特大地震影響鳄逾,放射性物質(zhì)發(fā)生泄漏稻轨。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一雕凹、第九天 我趴在偏房一處隱蔽的房頂上張望殴俱。 院中可真熱鬧政冻,春花似錦、人聲如沸线欲。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽李丰。三九已至苦锨,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間趴泌,已是汗流浹背舟舒。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留嗜憔,地道東北人秃励。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像吉捶,于是被迫代替她去往敵國和親夺鲜。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評論 2 354