我是Spring事件監聽器的一個問題在我的Web應用程序中,任何即時幫助將不勝感激。春季事件監聽器被調用兩次
事件監聽器被註冊並調用兩次,如果我有循環依賴。
我有服務類,這對其他方法
@Service(PBSTaskService.BEAN_NAME)
public class PBSTaskServiceImpl extends StandardServiceImpl<ITask> implements PBSTaskService,ApplicationListener<SurveyDefinitionPublishedEvent>
{
@Autowired
private AutoSelectTaskSliceRouteSyncService autoSelectTaskSliceRouteSyncService; // CYCLIC Dependency
@Override
public void onApplicationEvent(SurveyDefinitionPublishedEvent event)
{
System.out.println("PBSTSImpl"); // THIS IS CALLED TWICE
}
... Other method with @Transaction Annotation
}
@Service(AutoSelectTaskSliceRouteSyncService.BEAN_NAME)
public class AutoSelectTaskSliceRouteSyncServiceImpl implements AutoSelectTaskSliceRouteSyncService
{
@Autowired private PBSTaskService pbsTaskService; // CYCLIC dependency
}
現在,如果我從頭等艙刪除AutoSelectTaskSliceRouteSyncService依賴,OnApplicationEvent被調用一次,@Transaction註釋其他兩次。
我調試並發現, SimpleApplicationEventMulticaster.getApplicationListeners(myEvent):有兩個代理對象,一個包含Cglib和另一個默認的代理對象。但它只有兩個,如果它有循環依賴。如果我刪除循環依賴關係,它只有一個代理對象,並且那個代理對象被CGLIB提升。 我的Tx註釋: 我曾嘗試過使用proxy-target-class =「true或false」,但沒有運氣。
您可能希望有
在將服務類標記爲ApplicationListener時,在Grails 2.4.5中遇到同樣的問題。 – AndreyT