Whiteship's Note

@Aspect 붙은 클래스끼리는 상속이 안 됩니다.

Spring/Chapter 6 : 2007.04.02 15:53


이전 글을 작성하다가 문든 들은 생각(@Aspect 가 붙은 클래스들끼리 상속을 하면 포인트컷과 어드바이스를 상속할 수 있는가?)을 실험해봤습니다.
//CinamaAspect
@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 {

}

그리고 이전에 테스트를 돌리면 다음과 같은 에러메시지를 볼 수 있습니다.

org.springframework.beans.factory.BeanCreationException: Error creating bean with name '혜인' defined in class path resource [aop/newStyle/watchingMovieConfiguration.xml]: Cannot resolve reference to bean 'KCcard' while setting bean property 'card'; nested exception is 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 org.springframework.aop.framework.AopConfigException: aop.newStyle.aspect.ChildAspect cannot extend concrete aspect aop.newStyle.aspect.CinemaAspect
...

concrete aspect를 상속할 수 없다고 하길래 인터페이스를 만들어서 실험해 봤습니다.
//AbstractAspect
@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"/>

하지만 역시 에러가 납니다.
org.springframework.beans.factory.BeanCreationException: Error creating bean with name '혜인' defined in class path resource [aop/newStyle/watchingMovieConfiguration.xml]: Cannot resolve reference to bean 'KCcard' while setting bean property 'card'; nested exception is 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: 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 를 제거하고 다시 상속을 사용해봤습니다.
//CinemaAspect
@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가 붙어 있다 하더라도 인식하지 않습니다.


'Spring > Chapter 6' 카테고리의 다른 글

Advice parameters  (0) 2007.04.03
6.2. @AspectJ support  (0) 2007.04.03
@Around 어드바이스 예제  (0) 2007.04.03
@AfterReturning 어드바이스 만들기  (0) 2007.04.03
@Pointcut Designator  (0) 2007.04.02
@Aspect 붙은 클래스끼리는 상속이 안 됩니다.  (0) 2007.04.02
초간단 @Pointcut 과 @Advice 예제  (0) 2007.04.02
Enabling @AspectJ Support  (0) 2007.04.02
6.3. Schema-based AOP support  (0) 2007.04.01
6.1. Introduction  (0) 2007.04.01
Spring 2.0 AOP  (2) 2007.03.27
top