5.4.5 소개 by ks

소개(AspectJ의 내부타입선언이라고 알고있는) 는 주어진 인터페이스를 확장하는 advice된 오브젝트를 선언하는 aspect를 사용가능하고 그런 오브젝트의 행위에 인터페이스의 확장을 제공하기 위한 것이다.

@DeclareParents 어노테이션을 사용해서 소개를 만들 수 있다. 이 어노테이션은 새로운 부모(따라서 이름)를 가지는 타입을 매치하는 것을 선언하곤 한다. 예를 들어, UsageTracked라는 인터페이스와 DefaultUsageTracked라는 인터페이스의 구현이 주어지면, 다음 측면은 서비스 인터페이스의 모든 구현자가 또한 UsageTracked 인터페이스를 구현한다고 선언한다.

아래의 경우는 UsageTracked가 타입이라서야.

@Aspect
public class UsageTracking {

    @DeclareParents(value="com.xzy.myapp.service.*+", defaultImpl=DefaultUsageTracked.class)
    public static UsageTracked mixin;

    @Before("com.xyz.myapp.SystemArchitecture.businessService() && this(usageTracked)")
    public void recordUsage(UsageTracked usageTracked) {
        usageTracked.incrementUseCount();
    }

}

확장된 인터페이스는 어노테이트된 필드의 타입에 의해 결정된다. @DeclareParents 어노테이션의 value 속성은 AspectJ 타입 패턴이다. 매칭한 타입의 어떠한 빈도 UsageTracked 인터페이스를 확장한다. 실행 예제의 before advice에서 service 빈은 직접적으로 UsageTracked 인터페이스의 확장체로서 사용될 수 있다. 만약 빈을 프로그래밍적으로 접근하는 것은 아래와 같이 작성할 수 있다.

UsageTracked usageTracked = (UsageTracked) context.getBean("myService");

Last updated