Introductions

Dev.Hammy·2024년 3월 6일
0

소개(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);

0개의 댓글