CDI (Contexts and Dependency Injection) 為 Java EE 元件提供生命週期上下文綁定、依賴注入、鬆耦合交互服務,讓企業 Bean 可替換 JSF 管理 Bean,成為 Web 與企業層的橋樑。
受管 Bean 為容器管理的 Java 類,可指定命名空間,享有生命週期管理、資源注入等服務。JSF 受管 Bean 加上作用域,EJB 會話 Bean 加上事務服務,CDI 加上依賴注入服務。以 @Model (內建固定模式註解) 標記 MVC 模型物件。
Credentials Bean (請求作用域):
@Model public class Credentials {
private String username, password;
// getter/setter
}
Login Bean (會話作用域、狀態會話 Bean):
@Stateful @SessionScoped @Model
public class Login {
@Inject Credentials credentials;
@Inject EntityManager userDatabase;
@TransactionAttribute(REQUIRES_NEW) @RolesAllowed("guest")
public void login() { ... }
public void logout() { user = null; }
public boolean isLoggedIn() { return user != null; }
@Produces @LoggedIn @RolesAllowed("user") User getCurrentUser() { ... }
}
@SessionScoped 為 CDI 作用域註解,解決 EJB 無明確作用域、無法感知 Web 層上下文的問題。@Inject 執行型別安全注入,@Produces 標記生產者方法,@LoggedIn 為限定符 (@Qualifier)。
用戶提交登入表單 → 容器實例化 Credentials 與 Login 上下文實例 → JSF 綁定輸入值 → 呼叫 login() → 同一 HTTP 會話後續請求共享 Login 實例,並透過生產者方法提供當前用戶物件。