@Around("execution(* com.sangheon.*.EventService.*())") // com.sangheon으로 시작하는 EventService의 모든 메서드에 아래 행위를 적용하라 // 포인트컷을 여러곳에서 재사용할것이 아니라면 이렇게 사용하라.
public Object logPerf(ProceedingJoinPoint pjp) { //pjp는 어드바이스가 적용되는 대상 즉 메소드 자체로 보면된다. long begin = System.currentTimeMills()); Object reVal = pjp.proceed(); return reVal; } }
위의 경우 모든 메소드에 적용된다. deleteEvent에는 적용되기를 원치 않을경우 @annotation 을 만들어서 사용해보자.
1 2 3 4 5 6 7
@Target(ElementType.METHOD) @Retention(RetentionPolicy.CLASS) //컴파일까지 해당 어노테이션을 유지.. 이 줄은 생략가능 public @interface PerLogging {
}
이 후 적용되길 원하는 메소드에만 @PerLogging를 붙이자
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
@PerLogging @Override public void createEvent() { //로직 }
@PerLogging @Override public void publishEvent() { //로직 }
@Override public void deleteEvent() { //로직 }
그리고 아래처럼 @Around 어노테이션을 수정하자
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
@Component @Aspect public class PerfAspect {
@Around("@annotation(PerLogging)") // com.sangheon으로 시작하는 EventService의 모든 메서드에 아래 행위를 적용하라 // 포인트컷을 여러곳에서 재사용할것이 아니라면 이렇게 사용하라.
public Object logPerf(ProceedingJoinPoint pjp) { //pjp는 어드바이스가 적용되는 대상 즉 메소드 자체로 보면된다. long begin = System.currentTimeMills()); Object reVal = pjp.proceed(); return reVal; } }
이제 돌려보면 deleteEvent외에만 적용되는것을 확인할 수있다.
어드바이스 정의는 @Around 뿐만 아니라 @Before ,@AfterReturning, @AfterThrowing이 가능하다.