本篇文章为大家展示了Domain Event怎么在Spring Data中使用,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。
1.DDD与Spring Data
DDD: domain-driven design(领域驱动设计)是复杂需求下软件开发的实现方式。有时间我将专门来讲解一下DDD。
Spring Data在很多地方都是按照DDD原则进行的设计(如Repository), 这里Spring Data主要是实现了DDD的aggregate和domain event:
aggregate:一系列可以看成单一单元的领域对象的组合。如订单(order)和购物清单(line-items)都是单独的对象,但是将他们当成一个独立的单元(aggregate)。每个aggregate都有一个aggregate root,任何和外部交互应该只能通过aggregate root,这样aggregate root就可以确保aggregate的完整性。一个aggregate内部具有事务(数据一致性)边界。
domain event: aggregate之间为了保证数据的一致性,使用事件驱动架构(Event-Driven Architecture)来实现数据的最终一致性(Eventual consistency)。而这些事件是通过aggregate root发布的domain events。
下面我们演示一个当Person这个aggregate root 保存成功后,通过Person的gender属性对统计实体GenderStat更新男女性别的统计数量。
2.演示
2.1 Person Aggregate Root
Person作为Aggregate Root具备发布domain event的能力,在Spring Data 下可以有两种实现方式:
– 继承AbstractAggregateRoot,并使用其registerEvent()方法注册发布事件
– 使用@DomainEvents注解方法发布事件
如:
@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); } }
上述内容就是Domain Event怎么在Spring Data中使用,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注亿速云行业资讯频道。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。