@Aspect 붙은 클래스끼리는 상속이 안 됩니다.
이전 글을 작성하다가 문든 들은 생각(@Aspect 가 붙은 클래스들끼리 상속을 하면 포인트컷과 어드바이스를 상속할 수 있는가?)을 실험해봤습니다.
@Aspect
public class CinemaAspect {
@Pointcut("execution(* sellTicket(..))")
public void sellTicketPointcut() {
}
@Before("aop.newStyle.aspect.ChildAspect.sellTicketPointcut()")
public void weblcomeAdvice(){
System.out.println("안녕하세요. 어떤 영화를 보시겠습니까?");
}
}
//ChildAspect
@Aspect
public class ChildAspect extends CinemaAspect {
}
그리고 이전에 테스트를 돌리면 다음과 같은 에러메시지를 볼 수 있습니다.
...
concrete aspect를 상속할 수 없다고 하길래 인터페이스를 만들어서 실험해 봤습니다.
@Aspect
public interface AbstractAspect {
@Pointcut("execution(* sellTicket(..))")
public void sellTicketPointcut();
}
//ChildAspect
@Aspect
public class ChildAspect implements AbstractAspect {
/* (non-Javadoc)
* @see aop.newStyle.aspect.AbstractAspect#sellTicketPointcut()
*/
public void sellTicketPointcut() {
}
}
//설정파일
<bean id="cinemaAspect" class="aop.newStyle.aspect.CinemaAspect" />
<bean id="childAspect" class="aop.newStyle.aspect.ChildAspect" />
<bean id="abstractAspect" class="aop.newStyle.aspect.AbstractAspect" abstract="true"/>
하지만 역시 에러가 납니다.
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'KCcard' defined in class path resource [aop/newStyle/watchingMovieConfiguration.xml]: Initialization of bean failed; nested exception is java.lang.IllegalArgumentException: error at ::0 can't make static reference to abstract pointcut
Caused by: java.lang.IllegalArgumentException: error at ::0 can't make static reference to abstract pointcut...
흠.. ChildAspect에 있는 @Aspect 를 제거하고 다시 상속을 사용해봤습니다.
@Aspect
public class CinemaAspect {
@Pointcut("execution(* sellTicket(..))")
public void sellTicketPointcut() {
}
@Before("aop.newStyle.aspect.ChildAspect.sellTicketPointcut()")
public void weblcomeAdvice(){
System.out.println("안녕하세요. 어떤 영화를 보시겠습니까?");
}
}
//ChildAspect
public class ChildAspect extends CinemaAspect {
}
이렇게 하니까 제대로 동작을 합니다. 포인트컷은 상속이 되는 걸 확인했습니다. 하지만..advice를 ChileAspect로 옮겨 놓으니까 제대로 동작하지 않네요. 당연히...안되죠. ChileAspect는 이름만 Aspect일뿐 일반 클래스기 때문에 @Advice가 붙어 있다 하더라도 인식하지 않습니다.