iT邦幫忙

2021 iThome 鐵人賽

DAY 10
0
Software Development

Wow ! There is no doubt about Learn Spring framework in a month.系列 第 10

[Day - 10] - 運用FlywayDB自動化整合Spring JPA 的模式註解之旅

Abstract

在一套系統架構中,勢必需要運用到資料庫的存取概念,開發者勢必都會選擇一種ORM[Spring JPA、MyBatis或Hibernate]作為資料庫事務交易代理媒介,如此便可將所有創建、讀取、修改及刪除(CRUD)之資料事務交易簡單化,亦可防止各種資料庫注入式攻擊及提升開發效率,在這些物件關聯對應(ORM,Object-Relational Mapping )代理套件中,必定都會配置倉儲註解(@Reporitory)來表示資料接取物件(DAO,Data Access Object)對象,此模式註解支持所有物件持久化及例外拋出管理,透過此倉儲運用概念可提升運作事務交易效能,亦可整合各類模式註解,我們將在下面幫您逐一介紹囉。

Principle Introduction

前章節已提過各類註解可提供開發者進行整合,透過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進行自動掃瞄檢查並產生新資料表,提供開發者減少產生表的步驟,透過範例可以快速達到運用與測試。

Structure

在此架構中,可以看到服務一啟動會自動觸發flywaydb套件進行自動檢所及建立新資料表,並在將所有相關的元件(Component)自動匯入BeanFactory,由架構中可看出我們採用叫簡單化的Spring JPA物件關聯對應套件(ORM,Object Relational Mapping)進行事務倉儲交易,透過此套件我們可確切定義好服務與倉儲介面的事件觸發管理,確切保障所有資料的正確性及一致性。

image
圖一 倉儲交易架構圖

Sample Source

day-10-spring-repository-sample

Sample Boot follow up

跳轉至範例目錄中的“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

Test Report

Verify Spring JPA CRUD Action Report
image

Mind-blowing Spring JPA via Repository test detail
image

Reference Url

Spring Boot學習筆記(三)Repository的使用

終於弄懂了Spring@Component @Repository@Service的區別

Spring Boot 自动配置 : PersistenceExceptionTranslationAutoConfiguration


上一篇
[Day - 09] - Spring 模式註解之服務原理與開發
下一篇
[Day - 11] - Spring 注入式之Resource原理與開發
系列文
Wow ! There is no doubt about Learn Spring framework in a month.30

尚未有邦友留言

立即登入留言