소개(AspectJ에서는 유형 간 선언으로 알려짐)를 통해 aspect은 어드바이스된 객체가 주어진 인터페이스를 구현한다고 선언하고 해당 객체를 대신하여 해당 인터페이스의 구현을 제공할 수 있습니다.
@DeclareParents
annotation을 사용하여 소개를 할 수 있습니다. 이 annotation은 일치하는 type에 새로운 상위(따라서 이름)가 있음을 선언하는 데 사용됩니다. 예를 들어, UsageTracked
라는 인터페이스와 DefaultUsageTracked
라는 인터페이스의 구현이 주어지면 다음 aspect은 서비스 인터페이스의 모든 구현자가 UsageTracked
인터페이스도 구현함을 선언합니다(예: JMX를 통한 통계의 경우).
@Aspect
public class UsageTracking {
@DeclareParents(value="com.xyz.service.*+", defaultImpl=DefaultUsageTracked.class)
public static UsageTracked mixin;
@Before("execution(* com.xyz..service.*.*(..)) && this(usageTracked)")
public void recordUsage(UsageTracked usageTracked) {
usageTracked.incrementUseCount();
}
}
구현될 인터페이스는 annotation이 달린 필드의 type에 따라 결정됩니다. @DeclareParents
annotation의 value
속성은 AspectJ type 패턴입니다. 일치하는 type의 모든 Bean은 UsageTracked
인터페이스를 구현합니다. 이전 예제의 before advice에서 서비스 Bean은 UsageTracked
인터페이스의 구현으로 직접 사용될 수 있습니다. 프로그래밍 방식으로 Bean에 액세스하는 경우 다음을 작성합니다.
UsageTracked usageTracked = context.getBean("myService", UsageTracked.class);