Polyforms 專案目標直指痛點:**消除資料存取層 (DAO) 中大量重複的樣板代碼**。核心思想:開發者僅定義 Repository 介面,框架透過命名慣例與註解自動實現服務方法,並整合 Spring AOP 動態織入。本文詳細解析其核心機制、註解體系、命名規則與進階功能。
public interface UserRepository extends EntityRepository<User, String> {
@Finder
List<User> findByCreator(User creator);
}
save()、delete()、getById() 等基礎 CRUD。| 註解 | 用途 | 映射規則 |
|---|---|---|
@Finder | 查詢方法 | 預設命名查詢名 = EntityName.methodName (如 User.findByCreator);可自訂 @Finder("findUserByName") → User.findUserByName |
@Updater | 批量更新方法 | 對應命名更新查詢 |
@Counter | 統計計數方法 | 對應命名計數查詢 |
@NamedQueries({
@NamedQuery(name = "User.findByCreator",
query = "select u from User u where u.creator = :creator")
})
public class User {
// ... 欄位、關係映射
private User creator;
}
框架啟動時掃描 Repository 介面方法,匹配實體類上的 @NamedQuery,建立方法→查詢的綁定。
EntityRepository 的介面。Session/JPA EntityManager 執行 → 封裝結果返回。| 功能 | 描述 | 啟用方式 |
|---|---|---|
| 審計欄位自動管理 | createdBy, createdDate, lastModifiedBy, lastModifiedDate 自動填充 | 實體實現 Auditable 介面或標註 @CreatedBy 等註解 |
| 透明分頁支援 | 查詢方法參數加入 Pageable,自動注入 LIMIT/OFFSET | 方法簽名包含 Pageable 參數 |
| 聲明式事務邊界 | 方法級事務屬性 (propagation, isolation, timeout, readOnly) | 介面方法標註 @Transactional 或 XML 配置 |
| 領域事件模型 | 持久化事件 (預存、後存、刪除) 發布領域事件,解耦業務邏輯 | 實體方法標註 @DomainEvent 或實現事件發布介面 |
<bean class="org.polyforms.repository.support.RepositoryFactoryBean">
<property name="basePackage" value="com.example.repository"/>
<property name="entityManagerFactory" ref="entityManagerFactory"/>
</bean>
或 Java Config:
@Configuration
@EnablePolyformsRepositories(basePackages = "com.example.repository")
public class RepositoryConfig { }
@Finder 指定自定義命名查詢,或直接在介面定義預設方法 (Java 8+) 提供自定義實現。| 框架 | 核心機制 | 相似度 | 現狀 |
|---|---|---|---|
| Spring Data JPA | 介面驅動 + 方法名解析 / @Query | 極高 (精神繼承者) | 主流、活躍維護 |
| MyBatis Mapper | 介面 + XML/SQL 註解映射 | 中 (同屬介面驅動) | 主流、活躍 |
| Querydsl | 類型安全查詢 DSL | 低 (不同範疇) | 活躍 |
Polyforms 作為早期「介面驅動 Repository 自動實現」的探索者,其設計理念深刻影響了後來的 Spring Data JPA 等主流框架。雖專案本身可能已不再活躍維護,但其核心思想——**以介面為契約、以慣例優於配置、以 AOP 消除樣板**——仍是現代資料存取層設計的黃金法則。理解 Polyforms 有助於深入掌握 Spring Data 等現代框架的底層運作原理。