Java EE 5(2006 年發布)確立了「開發者生產力第一」的核心目標,通過註解與合理默認值兩大機制,徹底改寫了企業級開發體驗:無需繁瑣 XML、無需實現廢棄接口、無需樣板代碼,一個 POJO 加幾個註解即可成為 Web Service、EJB 或 JPA 實體。
wsimport 工具自動生成客戶端存根、異步調用代碼、異常類web.xml 大部分配置,通配符映射更靈活| J2EE 1.4 (EJB 2.x) | Java EE 5 (EJB 3.0) |
|---|---|
必須實現 SessionBean 接口(6 個空方法) |
POJO + @Stateless/@Stateful 註解 |
需 Home/Remote 接口、部署描述符 ejb-jar.xml |
無接口視圖或單一業務接口,註解替代 XML |
依賴查找:JNDI + PortableRemoteObject.narrow() |
依賴注入:@EJB 直接注入 |
| CMP 實體 Bean 配置極其複雜 | JPA 實體:@Entity + @Table + @Id,ORM 即配置即代碼 |
JPA 查詢語言(JPQL)亮點:面向對象、支持關聯導航無需 JOIN、參數化查詢(位置/命名參數)、類 SQL 語法(DISTINCT、ORDER BY、GROUP BY)。
Application Deployment 1.1、Application Management 1.1、Java ACC 1.1 —— 均為小幅增強,保持向後兼容。
一個包含 Web 前端、EJB 業務邏輯、Web Service 統計接口、第三方天氣服務調用的完整應用。
@WebService + @EJB@WebService
public class RideStatistics {
@EJB RideManagerRemote rideManager; // 依賴注入,無 JNDI 代碼
public Integer rideOffersFromZipCode(Integer zipCode) {
return rideManager.findCloseOfferMatches(zipCode, 0).size();
}
public Integer rideOffersToZipCode(Integer zipCode) {
return rideManager.findCloseOfferMatches(0, zipCode).size();
}
}
部署後自動發布 WSDL:https://host:port/app/RideStatisticsService?WSDL。
@Stateless + 生命周期註解@Stateless
public class RideManagerBean implements RideManagerRemote {
@PersistenceContext EntityManager em;
@PostConstruct // 替代 ejbCreate()
public void init() { ... }
@PreDestroy // 替代 ejbRemove()
public void cleanup() { ... }
// 業務方法...
}
wsimport 生成代碼@WebMethod(operationName = "GetWeatherByZipCode",
action = "https://www.webservicex.net/GetWeatherByZipCode")
public WeatherForecasts getWeatherByZipCode(
@WebParam(name = "ZipCode", targetNamespace = "https://www.webservicex.net")
String zipCode);
@WebService 類中所有 public 方法自動暴露為操作,方法名即操作名@WebMethod、@WebParam 等細粒度註解Java EE 5 以註解為槓桿,撬起了企業級開發的簡化革命。它證明了:強大功能不必伴隨高複雜度。對於仍在維護 J2EE 老項目的團隊,遷移到 Java EE 5+(或現代 Jakarta EE)將顯著降低維護成本、縮短交付週期、釋放開發者創造力。下一代 Jakarta EE 更進一步拥抱 Cloud Native、MicroProfile,但「註解驅動、約定優於配置」的核心基因始終未變。