CDI Services *Decoretions *Intercepters * Scope * EL\(Sp EL) *Eventmodel

1.Decorators裝飾器綜述

  攔截器是一種強大的方法在應用程序捕捉運行方法和解耦。攔截器能夠攔截任何java類型的調用. 
  這使得攔截器適合解決事務管理,安全性,以及日記記錄. 
  本質上說,攔截器並不知道他們截獲的實際語義事件.所以,攔截器並非很適合和系統的業務掛鉤. 

  而本章的裝飾器,則又不同. 
  裝飾器只截取調用某個Java接口,所以獲知這個接口的全部語義鏈接。 
  decorator直接實現與業務語義操做,這也意味着裝飾沒有攔截器的通用性。 
  攔截器和修飾符,儘管在不少方面類似,是互補的。但decorator沒法解決技術問題,橫跨許多不一樣的類型。java

 

用@Decorator標註一個bean(甚至多是一個抽象類),這樣就代表此類是裝飾器. 正則表達式

@Decorator
public abstract class LargeTransactionDecorator implements Account {
   ...
}

  裝飾器的裝修類型實現方法,可讓他攔截他想要攔截的.設計模式

@Decorator
public abstract class LargeTransactionDecorator implements Account {
 
   @Inject @Delegate @Any Account account;
 
   @PersistenceContext EntityManager em;
     
   public void withdraw(BigDecimal amount) {
      ...
   }
  
   public void deposit(BigDecimal amount);
      ...
   }
}

 

2.攔截器綜述

  攔截器的功能是定義在Java攔截器規範。數組

  攔截器規範定義了三種攔截點: 安全

  1. 業務方法攔截,
  2. 生命週期回調偵聽,
  3. 超時攔截(EJB)方法。

  在容器的生命週期中進行攔截 cookie

public class DependencyInjectionInterceptor {
   @PostConstruct
   public void injectDependencies(InvocationContext ctx) { ... }
}

  EJB超時時使用的攔截器 session

public class TimeoutInterceptor {
 
   @AroundTimeout
   public Object manageTransaction(InvocationContext ctx) throws Exception { ... }
}

  在業務上,對某一個Bean的方法進行攔截 app

public class TransactionInterceptor {
 
   @AroundInvoke
   public Object manageTransaction(InvocationContext ctx) throws Exception { ... }
}

  @AroundInvoke註釋指定了要用做攔截器的方法,攔截器方法與被攔截的業務方法執行同一個java調用堆棧、同一個事務和安全上下文中。用@AroundInvoke註釋指定的方法必須遵照如下格式:public Object XXX(javax.interceptor.InvocationContext ctx) throws Exception 框架

3.EL/SpEL

一、EL語言(CDI與表達式語言(EL)集成,容許在JavaServer Faces頁面或JavaServer Pages頁面中直接使用任何組件)post

  1)概述;
    EL是JSP內置的表達式語言,用以訪問頁面的上下文以及不一樣做用域中的對象 ,取得對象屬性的值,或執行簡單的運算或判斷操做。EL在獲得某個數據時,會自動進行數據類型的轉換。使用EL表達式輸出數據時,若是有則輸出數據,若是爲null則什麼也不輸出。

  2)語法:
    a.EL表達式老是放在{}中,並且前邊有一個$做爲前綴:${}
    b.獲取對象的屬性值能夠直接經過「對象.屬性名」:${user.name};注意:這裏的屬性名是get和set方法對應的屬性值,並非對象中的變量名。
    c.獲取對象的屬性也能夠經過「對象[「屬性名」]」:${user["name"]}
    d.獲取Map中屬性時能夠以直接經過屬性的key:${map.key},${map[key]}
    e.在指定域中獲取屬性:
  在EL表達式中若是咱們直接使用屬性名如:${user},它將會在四個域中由小到大依次查找。
  順序:pageScope、requestScope、sessionScope、applicationScope。也能夠指定從哪一個域中獲取:
    ${ pageScope .user }:當前頁面
    ${requestScope.user}:當前請求
    ${sessionScope.user}:當前會話
    ${sessionScope.user}:當前應用

  3)EL中包含11個隱含對象,這些對象能夠在EL表達式中直接使用:
    a.pageContext,和JSP中的pageContext功能同樣
    b.請求域:pageScope/requestScope/sessionScope/applicationScope
    c.請求參數,參數對象主要用於獲取get或post請求中的參數:
      param:獲取指定的請求參數,${param.username}
      paramValues:獲取請求參數數組,如:${paramValues.sport[1]}
    d.其餘:header/headerValues/initParam/cookie

  4)EL支持數學運算和邏輯運算:
    a.加減乘除:${17+5} => 22
    b.取餘%或mod:${17%5} => 2
    c.比較運算符>,<,==,!=,<=,>=,eq,ne,lt,gt,le,ge:${3>5}或${3 gt 5} =>false
    d.邏輯比較 &&或and,!或not,||或or,empty:${!true} => false

2.SpEL

  1)Spring框架的表達式語言(簡稱SpEL):是一個支持運行時查詢和操做對象圖的強大的表達式語言。SpEL 爲 bean 的屬性進行動態賦值提供了便利.
  2)語法:SpEL 使用 #{…} 做爲定界符,全部在大框號中的字符都將被認爲是 SpEL  

  3)運用範圍:

    a. 對 bean 進行引用,調用屬性值:#{book.name}
    b.調用方法以及引用對象中的屬性
      引用方法:#{dog.run()},引用靜態方法:#{T(java.lang.Math).PI}
      引用對象的屬性:#{user.name}
    c.計算表達式的值
      加減乘除:#{counter.total + 40},#{T(java.lang.Math).PI * 2}
      加號做爲字符串鏈接符:#{user.name + ' ' + user.address}
      比較運算符(>,<,=,>=,<=,==,lt,gt,eq,le,ge):#{counter.total == 100},#{counter.total le 1000}
      if-else條件判斷,三元運算符:#{user.name=='Tom' ? 'Jess'}
    d.正則表達式的匹配(matches)   #{user.name matches '^[a-zA-Z0-9_-]{4,16}$'}
    e.字面量的表示:#{5},#{89.7},#{1e4},#{false}

可以使用單/雙引號做爲字符串表達符號:#{'Chuck'},#{"Chuck"}

 

4.Eventmodel

Cdi中的event事件,是整個CDI的精華所在之一.其有點相似設計模式中的觀察者模式.但也有不一樣的地方.以下3點:

  1. 不只是生產者(producers)從觀察者(observers)解耦.觀察者也從生產者解耦.
  2. 觀察者能夠指定「選擇器」的組合來縮小的事件通知
  3. 觀察者能夠當即通知,或者能夠指定交付的事件應該推遲到當前事務的結束。

即用一種維護生產者和觀察者之間的分離代碼的方式,來產生和訂閱(即觀察)在應用程序中發生的事件。使用 javax.enterprise.event.Event 類建立事件,並使用 CDI 的 @Observes 標註訂閱處理事件。

相關文章
相關標籤/搜索