만드는 방법은 이전에도 살짝 살펴봤지만 소스는 아래와 같습니다.

public class WelcomeAdvice implements MethodBeforeAdvice {

    public void before(Method method, Object[] args, Object target) throws Throwable {
        System.out.println("어떤 영화를 보시겠습니까?");
    }

}

public class ThankYouAdvice implements AfterReturningAdvice {

    public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable {
        System.out.println("감사합니다.");
    }

}

Advice만 만든 상태에서 이걸 ProxyFactoryBean에 주입시킵니다.

    <!-- Advice -->
    <bean id="welcome" class="aop.oldStyle.advice.WelcomeAdvice" />
    <bean id="thanks" class="aop.oldStyle.advice.ThankYouAdvice" />

    <!-- AOP cinema -->
    <bean id="AOP씨네마" class="org.springframework.aop.framework.ProxyFactoryBean" >
        <property name="proxyInterfaces" value="aop.oldStyle.domain.Cinema" />
        <property name="interceptorNames">
            <list>
                <value>welcome</value>
                <value>thanks</value>
            </list>
        </property>
        <property name="target" ref="기선씨네마" />
    </bean>

이제 테스트를 해봅니다.

    @Test
    public void aopKeesunCinema() {
        hein.buyTicket(aopCinema, movie);
    }

당연히 원한대로의 결과가 나옵니다.

어떤 영화를 보시겠습니까?
감사합니다.

그럼 ProxyFactoryBean에 지정한 인터페이스의 다른 메소드들을 호출하면 어떻게 될까요?

    @Test
    public void onlyAdviceTest() {
        aopCinema.checkTicket(hein, movie);
        aopCinema.giveMemberShipCard(hein);
        aopCinema.playMovie(movie);
        aopCinema.sellTicket(movie, new Date());
    }

전혀.. 원하던 결과가 아니게 됩니다.

어떤 영화를 보시겠습니까?
감사합니다.
어떤 영화를 보시겠습니까?
감사합니다.
어떤 영화를 보시겠습니까?
공공의적상영합니다.
감사합니다.
어떤 영화를 보시겠습니까?
감사합니다.


ProxyFactoryBean에는 Advice도 등록할 수 있고 포인트컷은 해당 인터페이스에 지정한 모든 메소드가 라는 걸 확인 할 수 있습니다.

이래서 포인트컷으로 원하는 곳에만 Advice가 적용될 수 있도록 지정한뒤, 그것을 Advice와 뭉쳐서 Advisor로 등록하고 그것을 Advice를 등록한 위치(interceptorNames)에 넣어 두면 원하는 곳에만 원하는 일을 추가할 수 있게 되겠습니다.