Quarkus中的依賴注入DI和面向切面aop編程
前言
做java開發(fā)的肯定清楚spring中的核心思想ioc和aop,ioc即控制反轉(zhuǎn)的意思,di的核心思想和ioc一樣,描述的也是同一個(gè)事情同一個(gè)思想,只是di的依賴注入更容易被理解了,aop即面向切面,如注解事務(wù)功能,就是基于aop的思想來實(shí)現(xiàn)的。Quarkus中也實(shí)現(xiàn)了一套非標(biāo)準(zhǔn)的cdi規(guī)范,下面就來看看Quarkus中的di和aop相關(guān)內(nèi)容。
cdi規(guī)范協(xié)議:https://docs.jboss.org/cdi/spec/2.0/cdi-spec.html#introduction
JSR 365:Java 2.0的上下文和依賴注規(guī)范
該規(guī)范定義了一組功能強(qiáng)大的補(bǔ)充服務(wù),這些服務(wù)有助于改善應(yīng)用程序代碼的結(jié)構(gòu)。
- 綁定到生命周期上下文的有狀態(tài)對(duì)象的定義良好的生命周期,其中上下文集是可擴(kuò)展的
- 復(fù)雜的類型安全的依賴項(xiàng)注入機(jī)制,包括在開發(fā)或部署時(shí)選擇依賴項(xiàng)的能力,而無需進(jìn)行冗長(zhǎng)的配置
- 支持Java EE模塊化和Java EE組件體系結(jié)構(gòu)-解決Java EE組件之間的依賴關(guān)系時(shí)要考慮Java EE應(yīng)用程序的模塊化結(jié)構(gòu)
- 與統(tǒng)一表達(dá)語言(EL)集成,允許在JSF或JSP頁面中直接使用任何上下文對(duì)象
- 裝飾注入對(duì)象的能力
- 通過類型安全的攔截器綁定將攔截器與對(duì)象相關(guān)聯(lián)的能力
- 一個(gè)事件通知模型
- 除了Java Servlets規(guī)范定義的三個(gè)標(biāo)準(zhǔn)Web上下文之外的Web 對(duì)話上下文
- 允許便攜式擴(kuò)展與容器完美集成的SPI
通俗的說,JSR365是一套java實(shí)現(xiàn)DI依賴注入功能的接口設(shè)計(jì),具體的框架只要實(shí)現(xiàn)這條接口,就可以正常的提供依賴注入功能,Quarkus就是實(shí)現(xiàn)的這套api,但是沒有完全實(shí)現(xiàn),所有只有部分功能。這里不研究具體的規(guī)范協(xié)議,內(nèi)容太多了,有興趣的可以在上面的地址中翻閱,下面主要看看在Quarkus中,怎么使用的。
Bean聲明和依賴注入
/** * @author kl : http://kailing.pub * @version 1.0 * @date 2020/7/13 16:55 */ @ApplicationScoped public class TestBean { @Inject Bean1 bean1; } @ApplicationScoped class Bean1 { String ping() { return "Bean1"; } }
在Quarkus中,可以使用@Dependent,@ApplicationScoped,@Singleton,@RequestScoped和@SessionScoped等CDI中定義的注解去聲明一個(gè)Bean對(duì)象,支持 @Inject注解和構(gòu)造函數(shù)注入一個(gè)Bean。默認(rèn)情況下,本聲明的Bean都是延遲加載的,在應(yīng)用第一次接收請(qǐng)求時(shí)才會(huì)初始化這個(gè)bean,如果需要在應(yīng)用程序啟動(dòng)時(shí)就加載Bean,需要在Bean上添加如下注解:
/** * @author kl : http://kailing.pub * @version 1.0 * @date 2020/7/13 16:55 */ @ApplicationScoped @Startup public class TestBean { @Inject Bean1 bean1; }
Bean的生命周期
@ApplicationScoped @Startup public class TestBean { @Inject Bean1 bean1; @PostConstruct private void init(){ System.out.println("實(shí)例化后調(diào)用"); } @PreDestroy private void pre(){ System.out.println("銷毀前調(diào)用"); } void startup(@Observes StartupEvent event) { System.out.println("應(yīng)用啟動(dòng)后調(diào)用"); } void stop(@Observes ShutdownEvent event) { System.out.println("應(yīng)用關(guān)閉后調(diào)用"); } }
條件化初始Bean
/** * @author kl : http://kailing.pub * @version 1.0 * @date 2020/7/13 16:55 */ @ApplicationScoped @Startup public class TestBean { @Inject Bean1 bean1; } @Dependent class BeanConfig{ @Produces @IfBuildProperty(name = "quarkus.bean1.enabled", stringValue = "true") private Bean1 bean1(){ return new Bean1(); } } class Bean1 { String ping() { return "Bean1"; } }
如上,只有在配置文件中顯示的配置quarkus.bean1.enabled=true時(shí),才會(huì)激活Bean1的初始化
面向切面編程aop
Quarkus中編寫aop的程序和spring中類似,首先定義一個(gè)切點(diǎn)注解
@Inherited @InterceptorBinding @Target({ElementType.TYPE, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) public @interface Logging { }
然后編寫切面類
@Logging @Interceptor class LogInterceptor { private final Logger logger = LoggerFactory.getLogger(getClass()); @AroundInvoke public Object logging(InvocationContext ic) throws Exception { logger.info("方法參數(shù):{}", ic.getParameters().toString()); return ic.proceed(); } }
編寫切面類時(shí),只需要在切面類上將自定義的注解標(biāo)注在類上即可,然后使用@AroundInvoke注解標(biāo)注方法,被攔截到方法時(shí),方法調(diào)用信息會(huì)自動(dòng)注入到InvocationContext中。Quarkus中的aop沒有spring中那么多的概念,只有環(huán)繞通知的使用方式。使用時(shí),將自定義的注解標(biāo)注在類或者方法上即可
Bean列表接口
Quarkus在本地開發(fā)時(shí),會(huì)自動(dòng)注冊(cè)HTTP GET- /quarkus/arc/beans接口,返回所有Bean的列表
結(jié)語
以上,是Quarkus中依賴注入和面向切面的基本使用方式和技巧,雖然沒有spring的功能那么多那么細(xì)分。但是基本的功能都已具備了
以上就是Quarkus中的依賴注入DI和面向切面aop編程的詳細(xì)內(nèi)容,更多關(guān)于Quarkus中DI與aop編程的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java協(xié)程編程之Loom項(xiàng)目實(shí)戰(zhàn)記錄
這篇文章主要介紹了Java協(xié)程編程之Loom項(xiàng)目嘗鮮,如果用嘗鮮的角度去使用Loom項(xiàng)目,可以提前窺探JVM開發(fā)者們是如何基于協(xié)程這個(gè)重大特性進(jìn)行開發(fā)的,這對(duì)于提高學(xué)習(xí)JDK內(nèi)核代碼的興趣有不少幫助,需要的朋友可以參考下2021-08-08SpringBoot中實(shí)現(xiàn)Redis緩存預(yù)熱
緩存預(yù)熱是一種在系統(tǒng)啟動(dòng)后,但在實(shí)際使用前將數(shù)據(jù)加載到緩存中的技術(shù),本文主要來和大家一起探討如何在Spring Boot應(yīng)用程序中實(shí)現(xiàn)Redis緩存預(yù)熱,以確保系統(tǒng)在處理請(qǐng)求前就已經(jīng)處于最佳狀態(tài),感興趣的可以了解下2023-11-11Springboot2 集成 druid 加密數(shù)據(jù)庫密碼的配置方法
這篇文章給大家介紹Springboot2 集成 druid 加密數(shù)據(jù)庫密碼的配置方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2021-07-07詳解spring applicationContext.xml 配置文件
本篇文章主要介紹了詳解spring applicationContext.xml 配置文件 ,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-02-02解決MyEclipse6.5無法啟動(dòng),一直停留剛開始啟動(dòng)界面的詳解
本篇文章是對(duì)解決MyEclipse6.5無法啟動(dòng),一直停留剛開始啟動(dòng)界面的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05java如何將Object數(shù)組轉(zhuǎn)換為指定類型數(shù)組
這篇文章主要介紹了java如何將Object數(shù)組轉(zhuǎn)換為指定類型數(shù)組,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-08-08Mybatis-Plus主鍵插入null值報(bào)錯(cuò)問題及解決
這篇文章主要介紹了Mybatis-Plus主鍵插入null值報(bào)錯(cuò)問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07