Loading...
Spring Framework Reference Documentation 7.0.2의 Introductions의 한국어 번역본입니다.
아래의 경우에 피드백에서 신고해주신다면 반영하겠습니다.
감사합니다 :)
Introductions(AspectJ에서 inter-type declarations로 알려져 있음)는 aspect가 advised 객체가 주어진 인터페이스를 구현한다고 선언하고, 그 객체를 대신하여 그 인터페이스의 구현을 제공할 수 있게 해줍니다.
@DeclareParents 어노테이션을 사용하여 introduction을 만들 수 있습니다. 이 어노테이션은 매칭되는 타입이 새로운 parent를 갖도록 선언하는 데 사용됩니다(이름의 유래도 여기에서 왔습니다). 예를 들어, UsageTracked라는 이름의 인터페이스와 DefaultUsageTracked라는 이름의 그 인터페이스의 구현이 주어졌을 때, 다음 aspect는 서비스 인터페이스의 모든 implementor가 UsageTracked 인터페이스도 구현한다고 선언합니다(예를 들어, JMX를 통한 statistics를 위해):
1@Aspect 2public class UsageTracking { 3 4 @DeclareParents(value="com.xyz.service.*+", defaultImpl=DefaultUsageTracked.class) 5 public static UsageTracked mixin; 6 7 @Before("execution(* com.xyz..service.*.*(..)) && this(usageTracked)") 8 public void recordUsage(UsageTracked usageTracked) { 9 usageTracked.incrementUseCount(); 10 } 11 12}
1@Aspect 2class UsageTracking { 3 4 companion object { 5 @DeclareParents(value = "com.xyz.service.*+", 6 defaultImpl = DefaultUsageTracked::class) 7 lateinit var mixin: UsageTracked 8 } 9 10 @Before("execution(* com.xyz..service.*.*(..)) && this(usageTracked)") 11 fun recordUsage(usageTracked: UsageTracked) { 12 usageTracked.incrementUseCount() 13 } 14}
구현될 인터페이스는 어노테이션이 적용된 필드의 타입에 의해 결정됩니다. @DeclareParents 어노테이션의 value attribute는 AspectJ 타입 패턴입니다.
매칭되는 타입의 어떤 빈이든 UsageTracked 인터페이스를 구현합니다. 앞선 예제의 before advice에서 보듯이, 서비스 빈은 UsageTracked 인터페이스의 구현체로 직접 사용할 수 있습니다. 빈에 프로그래밍 방식으로 접근하는 경우, 다음과 같이 작성합니다:
1UsageTracked usageTracked = context.getBean("myService", UsageTracked.class);
1val usageTracked = context.getBean<UsageTracked>("myService")
Declaring Advice
Aspect Instantiation Models