2017-08-06 13 views
1

是否可以執行批註爲@After(類註釋爲@Aspec)異步的方法?例如使用註釋@Async或實現Runnable或Callable。對於標註爲@PostPersist的方法也是同樣的問題。異步執行@Aspect類或JPA事件觀察者

真實情況是在註冊後發送郵件。我不想在寄存器方法中執行一些MailService的方法,因爲這個服務會有太多的依賴關係,並且很難測試。但發送郵件必須執行異步操作,因爲此操作非常昂貴。

回答

1

應該不是問題。只需在方法「after」方法中啓動一個新線程即可。

AOP的工作原理如下(默認):

當您註冊需要某些方面應用於豆,春天創建圍繞這個bean的代理,並且當你從應用程序上下文中的bean(由ctx.getBean(MyBean.class)Autowire是在某個地方),您會收到包含真實/目標bean的代理。

因此,舉例來說,當你告訴Spring來執行的方法後,一些目標方法發生這種情況:

  1. 應用程序調用
  2. 如果事情已到目標之前執行的代理的方法方法(如配置的@Before操作)完成。
  3. 調用真實/目標方法
  4. 如果在目標方法(如配置的@After動作)之後必須執行某項操作,則會執行該操作。
  5. 在調用堆棧中的下一個方法執行

因此,與@After基本上你只是「插入」在調用棧的方法。你可以從那裏開始一個新的線程,它會立即返回控制,並在目標方法執行後的下一個事件。