1.DDD與Spring Data
DDD: domain-driven design(領域驅動設計)是複雜需求下軟件開發的實現方式。有時間我將專門來講解一下DDD。
Spring Data在很多地方都是按照DDD原則進行的設計(如Repository), 這裡Spring Data主要是實現了DDD的aggregate和domain event:
下面我們演示一個當Person這個aggregate root 保存成功後,通過Person的gender屬性對統計實體GenderStat更新男女性別的統計數量。
2.演示
2.1 Person Aggregate Root
Person作為Aggregate Root具備發布domain event的能力,在Spring Data 下可以有兩種實現方式:
如:
@Entity@Data@AllArgsConstructor@NoArgsConstructor@ToString(exclude = "domainEvents")public class Person { @Id @GeneratedValue private Long id; private String name; private Integer gender;//1:male;2:female @DomainEvents Collection<Object> domainEvents() { List<Object> events= new ArrayList<Object>(); events.add(new PersonSavedEvent(this.id,this.gender)); return events; } @AfterDomainEventPublication void callbackMethod() { // }}或
@Entity@Data@AllArgsConstructor@NoArgsConstructor@ToString(exclude = "domainEvents")public class Person extends AbstractAggregateRoot{ @Id @GeneratedValue private Long id; private String name; private Integer gender;//1:male;2:female public Person afterPersonSavedCompleted(){ registerEvent(new PersonSavedEvent(this.id,this.gender)); return this; }}2.2 監聽事件處理
@Componentpublic class GenderStatProcessor { @Autowired GenderRepository genderRepository; @Async @TransactionalEventListener public void handleAfterPersonSavedComplete(PersonSavedEvent event){ GenderStat genderStat = genderRepository.findOne(1l); if(event.getGender()==1){ genderStat.setMaleCount(genderStat.getMaleCount()+1); }else { genderStat.setFemaleCount(genderStat.getFemaleCount()+1); } genderRepository.save(genderStat); }} 3 源碼地址:https://github.com/wiselyman/spring-data-domain-event
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。