어드바이스 예제
around 어드바이스 역할을 메소드를 만듭니다. @Around 어드바이스 예제 의 예제와 거의 동일합니다.
메소드의 첫번째 인자로 ProceedingJoinPoint가 와야 하며 throws Throwable을 붙여줍니다.
public Object aroundSellTicket(ProceedingJoinPoint pjp) throws Throwable{
System.out.println("왔어? 영화 뭐 볼껀데?");
Ticket ticket = (Ticket) pjp.proceed();
System.out.println("쌩큐 " + ticket.getMovie().getName() + "잘봐!");
return ticket;
}
System.out.println("왔어? 영화 뭐 볼껀데?");
Ticket ticket = (Ticket) pjp.proceed();
System.out.println("쌩큐 " + ticket.getMovie().getName() + "잘봐!");
return ticket;
}
xml 설정 파일에 aound 어드바이스를 설정해 줍니다.
<aop:aspect id="cinema" ref="aspect">
<aop:before method="welcome" pointcut-ref="sellTicket" />
<aop:before method="welcome" pointcut-ref="checkTicket" />
<aop:after-returning method="afterSellTicket" pointcut-ref="sellTicket" returning="ticket"/>
<aop:around method="aroundSellTicket" pointcut-ref="sellTicket"/>
</aop:aspect>
<aop:before method="welcome" pointcut-ref="sellTicket" />
<aop:before method="welcome" pointcut-ref="checkTicket" />
<aop:after-returning method="afterSellTicket" pointcut-ref="sellTicket" returning="ticket"/>
<aop:around method="aroundSellTicket" pointcut-ref="sellTicket"/>
</aop:aspect>
테스트를 실행합니다.
@Test
public void sellTicket() {
cinema.sellTicket(movie, new Date());
}
public void sellTicket() {
cinema.sellTicket(movie, new Date());
}
어서 오세요. 무엇을 도와드릴까요?
왔어? 영화 뭐 볼껀데?
감사합니다. 공공의적을 구매 하셨습니다.
쌩큐 공공의적잘봐!
이 전에 사용했던 예제의 어드바이스가 같이 적용이 됐기 때문에 결과가 저러헤게 나왔습니다. 어드바이스가 적용되는 순서는 Advice ordering 여기서도 살펴봤지만 간단하게 aspect에 등록되어 있는 순이라고 생각해도 될 것 같습니다.