I'm not sure if I've misunderstood, but if I have, please let me know.
Are you trying to execute the save method multiple times in method A, but the save method is already listened to by AOP, so you want to execute the rest of the AOP process after all the save methods in method A are finished?
Based on my understanding, my solution is shown below
@Component
public class BatchProcessingState {
private final AtomicBoolean isBatchMode = new AtomicBoolean(false);
public void enableBatchMode() {
isBatchMode.set(true);
}
public void disableBatchMode() {
isBatchMode.set(false);
}
public boolean isBatchMode() {
return isBatchMode.get();
}
}
..
@Autowired
private BatchProcessingState batchProcessingState;
@Around("xxx")
public Object aroundSaveMethods(ProceedingJoinPoint joinPoint) throws Throwable {
if (batchProcessingState.isBatchMode()) {
return joinPoint.proceed();
}
System.out.println("Intercepts the save method and executes AOP logic...");
Object result = joinPoint.proceed();
System.out.println("The save method completes");
return result;
}
..
public void processBatch() {
// test entity list
List<News> newsList = new ArrayList<>();
for (int i = 0; i < 5; i++) {
News tempNews = new News();
tempNews.setTitle("this is a temp entity");
newsList.add(tempNews);
}
// handle
System.out.println("START, pause AOP");
batchProcessingState.enableBatchMode(); // close AOP
try {
for (News news : newsList) {
save(news); // AOP logic does not trigger
}
} finally {
batchProcessingState.disableBatchMode(); // resumption AOP
System.out.println("FINISH, resumption AOP");
}
}
Rusult:
START, pause AOP
(5 times the save method was executed)
FINISH, resumption AOP