Whiteship's Note

Advice ordering

Spring/Chapter 6 : 2007.04.04 11:59


@Aspect
public class CinemaAspect {

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

    @Before("sellTicketPointcut()")
    public void before1(){
        System.out.println("표 팔기 전 1");
    }

    @Before("sellTicketPointcut()")
    public void before2(){
        System.out.println("표 팔기 전 2");
    }

    @After("sellTicketPointcut()")
    public void after1(){
        System.out.println("표 팔고 나서 1");
    }

    @After("sellTicketPointcut()")
    public void after2(){
        System.out.println("표 팔고 나서 2");
    }
}

@Aspect
public class AnotherCinamaAspect {

    @Before("aop.newStyle.aspect.CinemaAspect.sellTicketPointcut()")
    public void before3(){
        System.out.println("표 사기 전 3");
    }

    @After("aop.newStyle.aspect.CinemaAspect.sellTicketPointcut()")
    public void after3(){
        System.out.println("표 사고 나서 3");
    }
}

다른 어스팩트 하나를 추가했습니다. 포인트컷은 이전 어스팩트와 같은 곳으로 지정했습니다. 결과는 다음과 같습니다.

이 두개의 어스팩트를 다음과 같은 순서로 등록해 두었습니다.
<bean id="anotherCinemaAspect" class="aop.newStyle.aspect.AnotherCinamaAspect" />
<bean id="cinemaAspect" class="aop.newStyle.aspect.CinemaAspect" />

결과는 다음과 같습니다.
표 팔기 전 3
표 팔기 전 1
표 팔기 전 2
표 팔고 나서 1
표 팔고 나서 2
표 팔고 나서 3

두 어스팩트를 등록한 순서를 바꿨더니 결과가 아래 처럼 바꼈습니다.
표 팔기 전 1
표 팔기 전 2
표 팔기 전 3
표 팔고 나서 3
표 팔고 나서 1
표 팔고 나서 2
before는 먼저 등록 bean에 있는 걸 먼저 실행하고 after는 나중에 등록된 bean에 있는 걸 먼저 실행합니다. 같은 bean 안에서는 before든 after든 등록 된 순서대로 실행됩니다.
두 개의 어스팩트 적용 순서를 Ordered 인터페이스나 @Order 어노테이션을 사용해서 getValue에서 낮은 값을 리턴할 수록 높은 우선 순위를 갖게 할 수 있다고 하는데 흠.. 테스트를 해봤는데 잘 안되는군요.

그렇게 하지 않아도 어차피 설정 파일에서 bean의 등록 순서가 위에 있을 수록 우선 순위가 높다는 걸 유념하면 되겠습니다.
top

Write a comment.