Advice parameters 여기서 살펴봤던 것과 거의 동일합니다. args() 표현식을 사용하여 포인트컷을 정의합니다.

<aop:pointcut id="sellTicket2" expression="execution(* sell*(..)) and args(movie,..)"/>

movie라는 이름의 파라미터를 받는 메소드의 조인포인트를 가리키게 됩니다. 이걸 받아서 처리할 어드바이스를 만듭니다.

    public void veryWelcome(Movie movie){
        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>

args-names에 넣어준 값 movie는 어드바이스 역할을 하는 메소드에서 받는 메개변수 이름입니다. 테스트를 실행하면 원하던 결과를 확인할 수 있습니다.

    @Test
    public void sellTicket() {
        cinema.sellTicket(movie, new Date());
    }

어서 오세요. 무엇을 도와드릴까요?
어서 오세요. 무엇을 도와드릴까요?
왔어? 영화 뭐 볼껀데?
하이 공공의적보려고?
감사합니다. 공공의적을 구매 하셨습니다.
쌩큐  공공의적잘봐!

before중에서 가장 마지막이고 around에서 pjp.proceed 이전에 수행하는 작업을 before로 보면 예상할 수 있는 위치에 수행된 걸 확인할 수 있습니다.