java与java ee_Java EE拦截器
java與java ee
歷史
我認(rèn)為重要的是要看一下Java EE中Interceptor的發(fā)展,因?yàn)樗菑腅JB特定的項(xiàng)目開始的,后來又演變成一個單獨(dú)的規(guī)范,現(xiàn)在可供其他Java EE規(guī)范擴(kuò)展,這一事實(shí)很簡單。
版本1.0
攔截器最初是在EJB 3.0 ( Java EE 5的一部分)中引入的。 攔截器沒有專門的規(guī)范,但是它們的版本為1.0,并通過簡單的注釋向托管Bean(POJO)購買了與AOP相關(guān)的基本功能:
- @AroundInvoke –注釋包含目標(biāo)類方法的攔截邏輯的方法
- @Intercerptors –將攔截器類與其目標(biāo)類/方法綁定在一起
- 通過部署描述符為整個模塊(EJB JAR)配置攔截器的能力
- @ExcludeDefaultInterceptors –使部署描述符中定義的默認(rèn)攔截器靜音
- @ExcludeClassInterceptors –使類的特定方法/構(gòu)造函數(shù)的全局定義(類級別)攔截器靜音
攔截器1.1
隨之而來的是帶有EJB 3.1的 Java EE 6 –攔截器1.1仍包含在EJB規(guī)范文檔中:
- @InterceptorBinding –一種指定類或方法的攔截器的類型安全方法。 請注意,此注釋由CDI 1.0 (Java EE 6中引入的另一個規(guī)范)所利用,并且其詳細(xì)信息位于CDI 1.0規(guī)范文檔中,而不是EJB 3.1中 (至少對我來說是燈泡時刻)。
- @Interceptor –用于在特定方法中顯式聲明一個包含攔截邏輯的類(用@AroundInvoke注釋)作為攔截器以及適當(dāng)?shù)腎nterceptor Binding。 僅在CDI 1.0文檔中也提到了這一點(diǎn)。
- @AroundTimeout –用于攔截EJB計(jì)時器的超時以及獲得被攔截的Timer實(shí)例的方式(通過javax.interceptor.InvocationContext.getTimer() )
攔截器1.2
攔截器在Java EE 7中被拆分成單獨(dú)的規(guī)范,因此攔截器1.2應(yīng)運(yùn)而生:
- 攔截器1.2是1.1的維護(hù)版本,因此JSR編號仍然與EJB 3.1( JSR 318 )相同。
- Interceptor.Priority (靜態(tài)類)–提供定義攔截器需要被調(diào)用的順序(優(yōu)先級)的能力。
- @AroundConstruct –用于攔截目標(biāo)類的構(gòu)造,即在調(diào)用目標(biāo)類的構(gòu)造函數(shù)之前先調(diào)用邏輯
重要的是要記住,攔截器通常適用于托管bean。 托管Bean本身是簡單的POJO,容器已將其授予基本服務(wù)–攔截器是其中之一,包括生命周期回調(diào),資源注入。
記憶輔助
將Interceptor視為可以在其整個生命周期中插入到bean的組件是有幫助的:
- 在構(gòu)建它們之前– @AroundConstruct
- 構(gòu)造之后– @PostConstruct
- 在他們的生命中(方法調(diào)用)– @AroundInvoke
- 銷毀之前– @PreDestroy
- EJB超時– @AroundTimeout
讓我們更詳細(xì)地了解攔截器的一些特征,并嘗試回答以下問題:
- 它們在哪里應(yīng)用,它們攔截了什么?
- 如何將攔截器綁定到應(yīng)該攔截的目標(biāo)(類)?
攔截器類型(基于攔截的組件)
方法攔截器
- 由@AroundInvoke實(shí)現(xiàn)
- 包含邏輯的方法可以是單獨(dú)類的一部分,也可以是目標(biāo)類(要攔截的類)本身的一部分。
生命周期回調(diào)攔截器
- 用@AroundConstruct裝飾方法,以攔截類的構(gòu)造函數(shù)調(diào)用
- 用@AroundConstruct注釋的方法不能是所攔截類的一部分。 必須使用單獨(dú)的Interceptor類定義它
- 在方法上使用@PostConstruct批注,以攔截托管bean上的回調(diào)方法。 再次說明一下-攔截器規(guī)范并未這樣定義新的注釋。 需要在攔截器方法上重用@PostConstruct( 公共注釋規(guī)范的一部分 )。
- @PreDestroy (在Common Annotations規(guī)范中定義的另一個回調(diào)注解)注解以類似的方式使用
超時攔截器
- 如上所述, @ AroundTimeout用于攔截EJB計(jì)時器的超時以及獲取被攔截的Timer實(shí)例的方式(通過javax.interceptor.InvocationContext.getTimer() )
應(yīng)用/綁定攔截器
使用@Interceptors
- 如以上示例所示–只需使用@Interceptors批注指定攔截器類
- @Interceptor可以在類級別上應(yīng)用(自動適用于類的所有方法),如果使用@AroundConstruct進(jìn)行特定于構(gòu)造函數(shù)的攔截器,則可以應(yīng)用于特定方法或多個方法和構(gòu)造函數(shù)
使用@IntercerptorBinding
- 攔截器綁定(如上所述)–使用@IntercerptorBinding批注定義一個綁定批注,該批注在偵聽器類和目標(biāo)類中將進(jìn)一步使用(需要攔截其方法,構(gòu)造函數(shù)等)
部署描述符
人們還可以使用部署描述符以明確的方式以及以覆蓋模式將注釋器和目標(biāo)類綁定到注釋。
這是Java EE攔截器的快速概述。 希望您找到更深層次的正確觸發(fā)!
翻譯自: https://www.javacodegeeks.com/2015/01/java-ee-interceptors.html
java與java ee
總結(jié)
以上是生活随笔為你收集整理的java与java ee_Java EE拦截器的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 咸吃萝卜淡操心是什么意思 咸吃萝卜淡操心
- 下一篇: react性能优化方案_React灵敏且