기선 씨네마 :: Advice
만드는 방법은 이전에도 살짝 살펴봤지만 소스는 아래와 같습니다.
public void before(Method method, Object[] args, Object target) throws Throwable {
System.out.println("어떤 영화를 보시겠습니까?");
}
}
public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable {
System.out.println("감사합니다.");
}
}
Advice만 만든 상태에서 이걸 ProxyFactoryBean에 주입시킵니다.
<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>
이제 테스트를 해봅니다.
public void aopKeesunCinema() {
hein.buyTicket(aopCinema, movie);
}
당연히 원한대로의 결과가 나옵니다.
감사합니다.
그럼 ProxyFactoryBean에 지정한 인터페이스의 다른 메소드들을 호출하면 어떻게 될까요?
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)에 넣어 두면 원하는 곳에만 원하는 일을 추가할 수 있게 되겠습니다.