BAEL-5061 Joinpoint vs. ProceedingJoinPoint in AspectJ (#11209)

* BAEL-5061 Joinpoint vs. ProceedingJoinPoint in AspectJ

* BAEL-5061 Joinpoint vs. ProceedingJoinPoint in AspectJ

* BAEL-5061 Joinpoint vs. ProceedingJoinPoint in AspectJ

* BAEL-5061 Joinpoint vs. ProceedingJoinPoint in AspectJ

* BAEL-5061 Joinpoint vs. ProceedingJoinPoint in AspectJ

* BAEL-5061 Joinpoint vs. ProceedingJoinPoint in AspectJ - add tests

* BAEL-5061 Joinpoint vs. ProceedingJoinPoint in AspectJ - add tests

* BAEL-5061 Joinpoint vs. ProceedingJoinPoint in AspectJ - add tests

* BAEL-5061 Joinpoint vs. ProceedingJoinPoint in AspectJ - add tests

Co-authored-by: majewsk6 <krzysztof.majewski.km1@contractors.roche.com>
This commit is contained in:
Krzysztof Majewski
2021-09-13 17:18:32 +02:00
committed by GitHub
parent 8fc8af79bf
commit 141a837679
10 changed files with 405 additions and 0 deletions
@@ -0,0 +1,32 @@
package com.baeldung.joinpoint;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import java.util.Arrays;
import java.util.List;
import static java.util.stream.Collectors.toList;
@Service
public class ArticleService {
public List<String> getArticleList() {
return Arrays.asList(
"Article 1",
"Article 2"
);
}
public List<String> getArticleList(String startsWithFilter) {
if (StringUtils.isBlank(startsWithFilter)) {
throw new IllegalArgumentException("startsWithFilter can't be blank");
}
return getArticleList()
.stream()
.filter(a -> a.startsWith(startsWithFilter))
.collect(toList());
}
}
@@ -0,0 +1,27 @@
package com.baeldung.joinpoint;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
import java.util.logging.Logger;
@Aspect
@Component
public class JoinPointAfterThrowingAspect {
private static final java.util.logging.Logger log = Logger.getLogger(JoinPointAfterThrowingAspect.class.getName());
@Pointcut("execution(* com.baeldung.joinpoint.ArticleService.getArticleList(..))")
public void articleListPointcut() { }
@AfterThrowing(
pointcut = "articleListPointcut()",
throwing = "e"
)
public void logExceptions(JoinPoint jp, Exception e) {
log.severe(e.getMessage());
}
}
@@ -0,0 +1,30 @@
package com.baeldung.joinpoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.Map;
@Aspect
@Component
public class JoinPointAroundCacheAspect {
public final static Map<Object, Object> CACHE = new HashMap<>();
@Pointcut("execution(* com.baeldung.joinpoint.ArticleService.getArticleList(..))")
public void articleListPointcut() { }
@Around("articleListPointcut()")
public Object aroundAdviceCache(ProceedingJoinPoint pjp) throws Throwable {
Object articles = CACHE.get(pjp.getArgs());
if (articles == null) {
articles = pjp.proceed(pjp.getArgs());
CACHE.put(pjp.getArgs(), articles);
}
return articles;
}
}
@@ -0,0 +1,30 @@
package com.baeldung.joinpoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
import java.util.logging.Logger;
@Aspect
@Component
public class JoinPointAroundExceptionAspect {
private static final java.util.logging.Logger log = Logger.getLogger(JoinPointAroundExceptionAspect.class.getName());
@Pointcut("execution(* com.baeldung.joinpoint.ArticleService.getArticleList(..))")
public void articleListPointcut() { }
@Around("articleListPointcut()")
public Object aroundAdviceException(ProceedingJoinPoint pjp) throws Throwable {
try {
return pjp.proceed(pjp.getArgs());
} catch (Throwable e) {
log.severe(e.getMessage());
log.info("Retrying operation");
return pjp.proceed(pjp.getArgs());
}
}
}
@@ -0,0 +1,32 @@
package com.baeldung.joinpoint;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
import java.util.Arrays;
import java.util.logging.Logger;
import static java.lang.String.format;
@Aspect
@Component
public class JoinPointBeforeAspect {
private static final Logger log = Logger.getLogger(JoinPointBeforeAspect.class.getName());
@Pointcut("execution(* com.baeldung.joinpoint.ArticleService.getArticleList(..))")
public void articleListPointcut() { }
@Before("articleListPointcut()")
public void beforeAdvice(JoinPoint joinPoint) {
log.info(
format("Method %s executed with %s arguments",
joinPoint.getStaticPart().getSignature(),
Arrays.toString(joinPoint.getArgs())
)
);
}
}