5.4.5 소개 by ks

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

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

circle-info

아래의 경우는 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

Was this helpful?