1. 程式人生 > >@DomainEvents和@AfterDomainEventPublication註解使用及一點點點理解。

@DomainEvents和@AfterDomainEventPublication註解使用及一點點點理解。

問題

剛才在讀Spring-data-mongodb的文件,讀到7.7的時候就發現了@DomainEvents@AfterDomainEventPublication這麼兩個註解。

就看懂了最後一句每次呼叫Spring Data儲存庫的save(…)方法時,都會呼叫這些方法。哎,有意思,但是官方給的這個例子真的有點瞎。。自己試試吧。

試驗

一個使用者

public class Customer {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private
String username; private String password; private LocalDateTime createTime; @DomainEvents public List<Object> domainEvents() { System.out.println("domainEvents什麼時候呼叫呢"); System.out.println(this); return Stream.of(this).collect(Collectors.toList()); } @AfterDomainEventPublication
public void callbackMethod() { System.out.println("callbackMethod什麼時候呼叫呢"); } //省略getter setter 構造 toString等 }

試了一下如果這兩個方法放在其他類裡面是不會觸發的,難道必須得放在模型裡面嗎。

測試save和saveAll方法

    @Test
    public void testSave() {
        Customer customer = new Customer("a","a");
        customerDao.save(customer);
    }

    @Test
public void testSaveAll() { List<Customer> list = Stream.of(new Customer("b", "b"), new Customer("c", "c")).collect(Collectors.toList()); customerDao.saveAll(list); }

testSave()方法呼叫之後輸出

Hibernate: insert into t_customer (create_time, password, username) values (?, ?, ?)
domainEvents什麼時候呼叫呢
Customer{id=8, username='a', password='a', createTime=2018-06-08T18:22:11.665}
callbackMethod什麼時候呼叫呢

testSaveAll()方法呼叫之後輸出

Hibernate: insert into t_customer (create_time, password, username) values (?, ?, ?)
Hibernate: insert into t_customer (create_time, password, username) values (?, ?, ?)
domainEvents什麼時候呼叫呢
Customer{id=9, username='b', password='b', createTime=2018-06-08T18:23:15.853}
callbackMethod什麼時候呼叫呢
domainEvents什麼時候呼叫呢
Customer{id=10, username='c', password='c', createTime=2018-06-08T18:23:15.853}
callbackMethod什麼時候呼叫呢

結論

就如文件所說的那樣
@DomainEvents可以返回單個事件例項或事件集合
所有事件釋出後@AfterDomainEventPublication用於潛在地清理要釋出的事件列表

@DomainEvents用來發布時間,觸發機制在儲存的時候。
@AfterDomainEventPublication在事件釋出之後觸發。

有趣的一件事是@AfterDomainEventPublication只在@DomainEvents存在時才起作用。

具體怎麼使用有更理解的小夥伴分享一下。