Schema 기반 Advice parameters
Advice parameters 여기서 살펴봤던 것과 거의 동일합니다. args() 표현식을 사용하여 포인트컷을 정의합니다.
<aop:pointcut id="sellTicket2" expression="execution(* sell*(..)) and args(movie,..)"/>
movie라는 이름의 파라미터를 받는 메소드의 조인포인트를 가리키게 됩니다. 이걸 받아서 처리할 어드바이스를 만듭니다.
public void veryWelcome(Movie movie){
System.out.println("하이 " + movie.getName() + "보려고?");
}
System.out.println("하이 " + movie.getName() + "보려고?");
}
xml 파일에 설정해 줍니다.
<aop:aspect id="cinema" ref="aspect">
<aop:before method="welcome" pointcut-ref="sellTicket" />
<aop:before method="welcome" pointcut-ref="sellTicket" />
<aop:after-returning method="afterSellTicket" pointcut-ref="sellTicket" returning="ticket"/>
<aop:around method="aroundSellTicket" pointcut-ref="sellTicket"/>
<aop:before method="veryWelcome" pointcut-ref="sellTicket2" arg-names="movie"/>
</aop:aspect>
<aop:before method="welcome" pointcut-ref="sellTicket" />
<aop:before method="welcome" pointcut-ref="sellTicket" />
<aop:after-returning method="afterSellTicket" pointcut-ref="sellTicket" returning="ticket"/>
<aop:around method="aroundSellTicket" pointcut-ref="sellTicket"/>
<aop:before method="veryWelcome" pointcut-ref="sellTicket2" arg-names="movie"/>
</aop:aspect>
args-names에 넣어준 값 movie는 어드바이스 역할을 하는 메소드에서 받는 메개변수 이름입니다. 테스트를 실행하면 원하던 결과를 확인할 수 있습니다.
@Test
public void sellTicket() {
cinema.sellTicket(movie, new Date());
}
public void sellTicket() {
cinema.sellTicket(movie, new Date());
}
어서 오세요. 무엇을 도와드릴까요?
어서 오세요. 무엇을 도와드릴까요?
왔어? 영화 뭐 볼껀데?
하이 공공의적보려고?
감사합니다. 공공의적을 구매 하셨습니다.
쌩큐 공공의적잘봐!
before중에서 가장 마지막이고 around에서 pjp.proceed 이전에 수행하는 작업을 before로 보면 예상할 수 있는 위치에 수행된 걸 확인할 수 있습니다.