Quarkus中的依賴(lài)注入DI和面向切面aop編程
前言
做java開(kāi)發(fā)的肯定清楚spring中的核心思想ioc和aop,ioc即控制反轉(zhuǎn)的意思,di的核心思想和ioc一樣,描述的也是同一個(gè)事情同一個(gè)思想,只是di的依賴(lài)注入更容易被理解了,aop即面向切面,如注解事務(wù)功能,就是基于aop的思想來(lái)實(shí)現(xiàn)的。Quarkus中也實(shí)現(xiàn)了一套非標(biāo)準(zhǔn)的cdi規(guī)范,下面就來(lái)看看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的上下文和依賴(lài)注規(guī)范
該規(guī)范定義了一組功能強(qiáng)大的補(bǔ)充服務(wù),這些服務(wù)有助于改善應(yīng)用程序代碼的結(jié)構(gòu)。
- 綁定到生命周期上下文的有狀態(tài)對(duì)象的定義良好的生命周期,其中上下文集是可擴(kuò)展的
- 復(fù)雜的類(lèi)型安全的依賴(lài)項(xiàng)注入機(jī)制,包括在開(kāi)發(fā)或部署時(shí)選擇依賴(lài)項(xiàng)的能力,而無(wú)需進(jìn)行冗長(zhǎng)的配置
- 支持Java EE模塊化和Java EE組件體系結(jié)構(gòu)-解決Java EE組件之間的依賴(lài)關(guān)系時(shí)要考慮Java EE應(yīng)用程序的模塊化結(jié)構(gòu)
- 與統(tǒng)一表達(dá)語(yǔ)言(EL)集成,允許在JSF或JSP頁(yè)面中直接使用任何上下文對(duì)象
- 裝飾注入對(duì)象的能力
- 通過(guò)類(lèi)型安全的攔截器綁定將攔截器與對(duì)象相關(guān)聯(lián)的能力
- 一個(gè)事件通知模型
- 除了Java Servlets規(guī)范定義的三個(gè)標(biāo)準(zhǔn)Web上下文之外的Web 對(duì)話(huà)上下文
- 允許便攜式擴(kuò)展與容器完美集成的SPI
通俗的說(shuō),JSR365是一套java實(shí)現(xiàn)DI依賴(lài)注入功能的接口設(shè)計(jì),具體的框架只要實(shí)現(xiàn)這條接口,就可以正常的提供依賴(lài)注入功能,Quarkus就是實(shí)現(xiàn)的這套api,但是沒(méi)有完全實(shí)現(xiàn),所有只有部分功能。這里不研究具體的規(guī)范協(xié)議,內(nèi)容太多了,有興趣的可以在上面的地址中翻閱,下面主要看看在Quarkus中,怎么使用的。
Bean聲明和依賴(lài)注入
/**
* @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("銷(xiāo)毀前調(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中編寫(xiě)aop的程序和spring中類(lèi)似,首先定義一個(gè)切點(diǎn)注解
@Inherited
@InterceptorBinding
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Logging {
}然后編寫(xiě)切面類(lèi)
@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();
}
}編寫(xiě)切面類(lèi)時(shí),只需要在切面類(lèi)上將自定義的注解標(biāo)注在類(lèi)上即可,然后使用@AroundInvoke注解標(biāo)注方法,被攔截到方法時(shí),方法調(diào)用信息會(huì)自動(dòng)注入到InvocationContext中。Quarkus中的aop沒(méi)有spring中那么多的概念,只有環(huán)繞通知的使用方式。使用時(shí),將自定義的注解標(biāo)注在類(lèi)或者方法上即可
Bean列表接口
Quarkus在本地開(kāi)發(fā)時(shí),會(huì)自動(dòng)注冊(cè)HTTP GET- /quarkus/arc/beans接口,返回所有Bean的列表
結(jié)語(yǔ)
以上,是Quarkus中依賴(lài)注入和面向切面的基本使用方式和技巧,雖然沒(méi)有spring的功能那么多那么細(xì)分。但是基本的功能都已具備了
以上就是Quarkus中的依賴(lài)注入DI和面向切面aop編程的詳細(xì)內(nèi)容,更多關(guān)于Quarkus中DI與aop編程的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java運(yùn)行時(shí)數(shù)據(jù)區(qū)概述詳解
這篇文章主要介紹了Java運(yùn)行時(shí)數(shù)據(jù)區(qū)概述,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03
Java使用continue語(yǔ)句的實(shí)例詳解
這篇文章主要介紹了Java使用continue語(yǔ)句的實(shí)例詳解的相關(guān)資料,希望通過(guò)本文能幫助到大家,讓大家掌握使用方法,需要的朋友可以參考下2017-10-10
為了多次讀取ServletInputStream引發(fā)的一系列問(wèn)題
這篇文章主要介紹了為了多次讀取ServletInputStream引發(fā)的一系列問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10
Java Enum和String及int的相互轉(zhuǎn)化示例
這篇文章主要介紹了Java Enum和String及int的相互轉(zhuǎn)化示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06
Java如何避免死鎖和競(jìng)態(tài)條件的實(shí)現(xiàn)
本文主要介紹了Java如何避免死鎖和競(jìng)態(tài)條件的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-05-05
java中@DateTimeFormat和@JsonFormat注解的使用
本文主要介紹了java中@DateTimeFormat和@JsonFormat注解的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08
Java使用itextpdf實(shí)現(xiàn)Excel轉(zhuǎn)PDF
這篇文章主要為大家詳細(xì)介紹了Java如何使用itextpdf實(shí)現(xiàn)Excel轉(zhuǎn)PDF,并且支持xlsx和xls兩種格,文中的示例代碼講解詳細(xì),希望對(duì)大家有所幫助2024-01-01
springboot prototype設(shè)置多例不起作用的解決操作
這篇文章主要介紹了springboot prototype設(shè)置多例不起作用的解決操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-09-09

