Spring AOP(old) Advisor
앞에서 살펴본 Advice와 Pointcut을 묶어서 하나의 Advisor로 만들 수 있습니다. 그 Advisor 하나를 보면 어디(Pointcut)에 뭐가(Advice) 적용될지 한눈에 보이게 됩니다.
이렇게 만든 Advisor 빈을 프록시 객체를 만들기 위한 ProxyFactoryBean에서 interceptorNames속성에 적어 주고, 타켓 빈을 target 속성에 적어 주고, 타켓 빈이 구현한 인터페이스를 proxyInterfaces에 적어 주면 프록시 bean을 사용할 수 있게 됩니다.
인터페이스가 없을 땐 CGLib을 사용한다고 했는데 어떻게 쓰는거지? 어딘가 예제가 나오겠지? 일단 지금은 그냥 인터페이스를 사용해서 프록시 객체 만드는 방법만...
Pointcut과 Advice를 설정할 수 있는 가장 일반적인 Advisor 클래스는 무엇인가? - 찾아봐야겠네요.
- AbstractBeanFactoryPointcutAdvisor, AbstractGenericPointcutAdvisor, AbstractPointcutAdvisor, AspectJExpressionPointcutAdvisor, AspectJPointcutAdvisor, DefaultBeanFactoryPointcutAdvisor, DefaultPointcutAdvisor, DynamicMethodMatcherPointcutAdvisor, NameMatchMethodPointcutAdvisor, PersistenceExceptionTranslationAdvisor, ReflectiveAspectJAdvisorFactory.SyntheticInstantiationAdvisor, RegexpMethodPointcutAdvisor, StaticMethodMatcherPointcutAdvisor, TransactionAttributeSourceAdvisor
PointcutAdvisor 인터페이스를 구현한 클래스들 입니다. 이중에서 DefaultPointcutAdvisor가 setAdvice()와 setPointcut()을 가지고 있으니까 이녀석을 사용해서 따로 존재하는 pointcut과 advice를 합치면 될 것 같습니다.
보통은 PointcutAdvisor의 이름들을 보시면 Pointcut 이름 마다 거기에 해당하는 Advisor가 존재하는 것 같습니다. 그 말은 포인트컷 따로 어드바이스 따로 만들어서 DefaultPointcutAdvisor로 합치지 말고 어드바이스는 따로 만들고 포인트 컷은 Advisor의 속성에 직접 주입하는 방식으로 만들때 사용하라는 것 같습니다. 포인트 컷을 재사용할 것이 아니라면 그게 편하겠네요. 아마도 어드바이스는 재사용하기가 유리하지만 포인트컷은 해당 어플리케이션에 종속되기 쉬우니까 재사용이 어렵기 때문이겠죠.