Tapestry 5 徹底拋棄繼承體系與 XML 配置,擁抱純 POJO 元件模型,以註解定義生命週期、注入、元件組合,實現「去框架化」開發體驗。
@ComponentClass
public class HelloWorld {
@BeginRender
void renderMessage(MarkupWriter writer) {
writer.write("Bonjour from HelloWorld component.");
}
}
| 註解 | 對應舊版機制 |
|---|---|
@ComponentClass | 標記為元件類(替代 extends BaseComponent) |
@SetupRender | 渲染前初始化(替代 PageBeginRenderListener) |
@BeginRender | 開始渲染標記輸出 |
@BeforeRenderBody | 渲染元件體內容前 |
@AfterRenderBody | 渲染元件體內容後 |
@AfterRender | 渲染結束 |
生命週期基於狀態機與佇列演算法,非尾遞歸,支援細粒度擴展點。
模組定義:
@Id("myapp")
public class MyAppModule {
public static Indexer buildIndexer() {
return new IndexerImpl();
}
}
服務注入:
@Inject("service:myapp.Indexer")
private Indexer indexer;
build{ServiceId}() 靜態工廠方法定義服務實例。@Inject("service:moduleId.ServiceId") 精確引用。contribute 等 HiveMind 風格擴展點。@ComponentClass
public class Countdown {
@Component(parameters = {"start=5", "end=1", "value=countValue"})
private Count _count;
private int _countValue;
public int getCountValue() { return _countValue; }
public void setCountValue(int v) { _countValue = v; }
}
@Component 定義子元件與參數綁定,替代 .page XML。| Tapestry 4 | Tapestry 5 | 遷移要點 |
|---|---|---|
| extends BasePage/Component | @ComponentClass + POJO | 移除繼承,補充生命週期註解 |
| abstract 方法 + .page XML | 具體 getter/setter + @Component | 屬性公開,參數綁定移至註解 |
| HiveMind module 描述符 | @Id + buildXxx() 靜態方法 | 服務定義內嵌於模組類 |
| @InjectObject("service:...") | @Inject("service:...") | 語法統一 |
| 無熱重載 | 支援元件/模板熱重載 | 開發體驗質變 |
tapestry-spring 模組無縫橋接 Spring Bean 為 Tapestry 服務。@CommitAfter 註解聲明式事務邊界。Tapestry 5 以「註解驅動、POJO 化、零配置、熱重載、極速執行」五大支柱,重新定義了 Java Web 元件框架標準。雖處早期開發階段,但其架構清晰度、開發體驗與效能潛力極具吸引力。對於尋求「輕量、類型安全、高生產力」的團隊,Tapestry 5 是值得投入評估的前瞻選擇。