首頁 > 軟體

Quarkus中的依賴注入DI和麵向切面aop程式設計

2022-02-22 16:00:19

前言

做java開發的肯定清楚spring中的核心思想ioc和aop,ioc即控制反轉的意思,di的核心思想和ioc一樣,描述的也是同一個事情同一個思想,只是di的依賴注入更容易被理解了,aop即面向切面,如註解事務功能,就是基於aop的思想來實現的。Quarkus中也實現了一套非標準的cdi規範,下面就來看看Quarkus中的di和aop相關內容。

cdi規範協定:https://docs.jboss.org/cdi/spec/2.0/cdi-spec.html

JSR 365:Java 2.0的上下文和依賴注規範

該規範定義了一組功能強大的補充服務,這些服務有助於改善應用程式程式碼的結構。

  • 繫結到生命週期上下文的有狀態物件的定義良好的生命週期,其中上下文集是可延伸的
  • 複雜的型別安全的依賴項注入機制,包括在開發或部署時選擇依賴項的能力,而無需進行冗長的設定
  • 支援Java EE模組化和Java EE元件體系結構-解決Java EE元件之間的依賴關係時要考慮Java EE應用程式的模組化結構
  • 與統一表達語言(EL)整合,允許在JSF或JSP頁面中直接使用任何上下文物件
  • 裝飾注入物件的能力
  • 通過型別安全的攔截器繫結將攔截器與物件相關聯的能力
  • 一個事件通知模型
  • 除了Java Servlets規範定義的三個標準Web上下文之外的Web 對話上下文
  • 允許行動式擴充套件與容器完美整合的SPI

通俗的說,JSR365是一套java實現DI依賴注入功能的介面設計,具體的框架只要實現這條介面,就可以正常的提供依賴注入功能,Quarkus就是實現的這套api,但是沒有完全實現,所有隻有部分功能。這裡不研究具體的規範協定,內容太多了,有興趣的可以在上面的地址中翻閱,下面主要看看在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中定義的註解去宣告一個Bean物件,支援 @Inject註解和建構函式注入一個Bean。預設情況下,本宣告的Bean都是延遲載入的,在應用第一次接收請求時才會初始化這個bean,如果需要在應用程式啟動時就載入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("範例化後呼叫");
    }
    @PreDestroy
    private void pre(){
        System.out.println("銷燬前呼叫");
    }
    void startup(@Observes StartupEvent event) {
        System.out.println("應用啟動後呼叫");
    }
    void stop(@Observes ShutdownEvent event) {
        System.out.println("應用關閉後呼叫");
    }
}

條件化初始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時,才會啟用Bean1的初始化

面向切面程式設計aop

Quarkus中編寫aop的程式和spring中類似,首先定義一個切點註解

@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("方法引數:{}", ic.getParameters().toString());
        return ic.proceed();
    }
}

編寫切面類時,只需要在切面類上將自定義的註解標註在類上即可,然後使用@AroundInvoke註解標註方法,被攔截到方法時,方法呼叫資訊會自動注入到InvocationContext中。Quarkus中的aop沒有spring中那麼多的概念,只有環繞通知的使用方式。使用時,將自定義的註解標註在類或者方法上即可

Bean列表介面

Quarkus在本地開發時,會自動註冊HTTP GET- /quarkus/arc/beans介面,返回所有Bean的列表

結語

以上,是Quarkus中依賴注入和麵向切面的基本使用方式和技巧,雖然沒有spring的功能那麼多那麼細分。但是基本的功能都已具備了

以上就是Quarkus中的依賴注入DI和麵向切面aop程式設計的詳細內容,更多關於Quarkus中DI與aop程式設計的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com