5.4.5 소개 by ks
소개(AspectJ의 내부타입선언이라고 알고있는) 는 주어진 인터페이스를 확장하는 advice된 오브젝트를 선언하는 aspect를 사용가능하고 그런 오브젝트의 행위에 인터페이스의 확장을 제공하기 위한 것이다.
@DeclareParents 어노테이션을 사용해서 소개를 만들 수 있다. 이 어노테이션은 새로운 부모(따라서 이름)를 가지는 타입을 매치하는 것을 선언하곤 한다. 예를 들어, UsageTracked라는 인터페이스와 DefaultUsageTracked라는 인터페이스의 구현이 주어지면, 다음 측면은 서비스 인터페이스의 모든 구현자가 또한 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?