Whiteship's Note

Advice parameters

Spring/Chapter 6 : 2007.04.03 15:33


예전에 공부할 때 여기를 공부하다가 멈췄었네요.
Advice parameters 1 (2)
드디어 따라잡았습니다. 흐흣.

1. Access to the current JoinPoint

해당 Advice가 끼어드는 joinpoint에 대한 정보를 얻어 올 수 있습니다. @Around 어드바이스를 제외한 다른 어드바이스들의 첫번째 파라미터로 JoinPoint 를 만들어 주면 됩니다.

    @Before("aop.newStyle.aspect.CinemaAspect.sellTicketPointcut()")
    public void weblcomeAdvice(JoinPoint jp){
        System.out.println(jp.getClass());
        System.out.println("안녕하세요. 어떤 영화를 보시겠습니까?");
    }

실제 객체는 MethodInvocationProceedingJoinPoint 이 클래스라는 걸 확인할 수 있습니다.

@Around 어드바이는 이전 글에서 봤듯이 ProceedingJoinPoint가 와야 합니다.

2. Passing parameters to advice

    @Pointcut("execution(aop.newStyle.domain.Ticket *.sell*(..))")
    public void sellTicketPointcut() {
    }

    @Before("aop.newStyle.aspect.CinemaAspect.sellTicketPointcut() &&" +
            "args(movie, ..)")
    public void weblcomeAdvice(JoinPoint jp, Movie movie){
        System.out.println("안녕하세요." + movie.getName() + " 을(를) 보시겠습니까?");

이렇게 args()를 사용하여 대상 메소드가 받을 인자를 가져올 수 있습니다.

다른 방법으로는 @Pointcut을 정의할 때 args()를 사용해서 다음과 같이 하는 건데요. IllegalArgumentExecption이 발생하는데 아직 원인을 모르겠습니다. 레퍼런스에 나와있는 코드와 똑같이 친것 같은데 말이죠. ㅠ.ㅠ

3. Determining argument names

공부해야 할 부분

4. Proceeding with arguments

@Around 에서 proceed()를 실행 할 때 들어갈 인자값을 바꿀 수 있는데요 그때는 proceed(Object[]) 메소드를 사용하면 됩니다.

@Around("aop.newStyle.aspect.CinemaAspect.sellTicketPointcut() && " +
            "args(movie,..)")
    public Object ticketAround(ProceedingJoinPoint pjp, Movie movie) throws Throwable{
        System.out.println("안녕하세요." + movie.getName() + " (을)를 보시겠습니까?");
        Ticket ticket = (Ticket)pjp.proceed(new Object[]{movie, new Date()});
        System.out.println(ticket.getMovie().getName() + " 를 구매하셨습니다.");
        System.out.println("감사합니다. 다음에 또 오세요.");
        ticket.getMovie().setName("바뀐 영화 이름");
        return ticket;
    }

top