除了一般DI的功能外,CDI多了Context Sensitive,Context在HTTP中,指的是Request, Response, Session, Application, …這些scopes. 當然還有搭配這些scope用的decorators, interceptors。 使用CDI最重要的事,莫過於決定物件要binding的scopes,針對這些scopes的使用時機如下:

Dependent

預設的scope,生命週期與被@injected的物件相同。

ApplicationScoped

跟著application server啟動而啟動,停止而停止的。

適用於比較特別的services(stateful), helper classes, 或sharing data(全局的權限或計數器)。

read only的service也很適合,因為不需要考慮thread safe的問題

RequestScoped

http request的scope。

適用於做http request溝通,常被當作網頁與程式邏輯間的DTO使用。

SessionScoped

http session的scope,隨sesion的建立而開始,session消滅而結束。

適用需要跟著使用者跑的資料或服務(像認證資訊或權限資訊)。

ConversationScoped

沒用過,不清楚,文件上是說常通比session短,但比request長的一個scope.

Stateless

這個應該不算是一個scope,但一般的service methods (objects)應該都屬stateless的。

TBD

  1. EL操作webbean方式
  2. 單元測試
  3. CDI與JPA
  4. decorators
  5. interceptors
  6. events
  7. @Producers
  8. @Disposers

[java

^1)^ 並沒有這種scope