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 监听事件处理
@Component public 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
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:notice#nhooo.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。