在一套系統架構中,勢必需要運用到資料庫的存取概念,開發者勢必都會選擇一種ORM[Spring JPA、MyBatis或Hibernate]作為資料庫事務交易代理媒介,如此便可將所有創建、讀取、修改及刪除(CRUD)之資料事務交易簡單化,亦可防止各種資料庫注入式攻擊及提升開發效率,在這些物件關聯對應(ORM,Object-Relational Mapping )代理套件中,必定都會配置倉儲註解(@Reporitory)來表示資料接取物件(DAO,Data Access Object)對象,此模式註解支持所有物件持久化及例外拋出管理,透過此倉儲運用概念可提升運作事務交易效能,亦可整合各類模式註解,我們將在下面幫您逐一介紹囉。
前章節已提過各類註解可提供開發者進行整合,透過Spring 核心內所提供的@Reporitory的持久層註解,此註解與元註解註冊方式相同,亦無註冊順序之分,此註解在切面式編程上多加了幾道工法,第一道為資料交易的例外事件進行例外事件分析與處理,這樣有什麼好處呢?就是不需要在DAO層加上try.....catch判斷,運用在每個代理對象添加一個PersistenceExceptionTranslationAdvisor元件,會將相關事務的交易例外事件處理成Spring框架異常,正是為了所有事物交易的持久化處理進而提升交易效率,以下範例我們採用Spring JPA來進行Postgresql事務交易,以下我們提供此範例進行介紹。
以下範例我們特別配製了一個註解(PostgresqlRepository),來特別註明DAO交易媒介。
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Repository
public @interface PostgresqlRepository {
@AliasFor(annotation = Repository.class)
String value() default "";
}
透過此註解來標明繼承Spring JPA的介面,予以額外分析事務交易例外事件,以提升效能。
@PostgresqlRepository
public interface DancingTableRepository extends JpaRepository<DanceRank, Integer> {
DanceRank findByName(String name);
List<DanceRank> findAll();
}
並將此Bean註冊於Service中,透過Contructor自動注入倉儲元件(@Repository),這樣亦可提供給Controller或相關服務進行觸發注入,達到個服務介接或達到服務導向架構(Service-Oriented Architecture,SOA) 開發。
@TransactionalService
public class DancingRankServiceImpl implements DancingRankService{
private final DancingTableRepository repository;
@Autowired
public DancingRankServiceImpl(DancingTableRepository repository) {
this.repository = repository;
}
...
public DanceRank getDanceRank(String name) {
return this.repository.findByName(name);
}
.....
}
透過以上程式碼我們可以看出開發者更進一步朝向網域驅動設計(Domain Driven Design,DDD)發展,透過此架構我們採用Flywaydb進行自動掃瞄檢查並產生新資料表,提供開發者減少產生表的步驟,透過範例可以快速達到運用與測試。
在此架構中,可以看到服務一啟動會自動觸發flywaydb套件進行自動檢所及建立新資料表,並在將所有相關的元件(Component)自動匯入BeanFactory,由架構中可看出我們採用叫簡單化的Spring JPA物件關聯對應套件(ORM,Object Relational Mapping)進行事務倉儲交易,透過此套件我們可確切定義好服務與倉儲介面的事件觸發管理,確切保障所有資料的正確性及一致性。
圖一 倉儲交易架構圖
day-10-spring-repository-sample
跳轉至範例目錄中的“docker-compose”,並進行建立postgresql資料庫容器,輸入下面指令
docker-compose -f docker-compose.yml up -d
當您自動觸發測試範例或啟動專案時,專案會自動進行會建立dancing_table資料表及產生一筆測試資料。
Run test task
gradle test
Run open result html
open ./build/reports/tests/test/classes/sw.spring.sample.DancingRankTestSuite.html
Verify Spring JPA CRUD Action Report
Mind-blowing Spring JPA via Repository test detail
Spring Boot學習筆記(三)Repository的使用
終於弄懂了Spring@Component @Repository@Service的區別
Spring Boot 自动配置 : PersistenceExceptionTranslationAutoConfiguration