2024. 11. 17. 12:19ㆍSpring Framework/Aspect Oriented Programming with Spring
Introductions
Introductions(AspectJ에서는 inter-type declarations라고도 함)는 특정 aspect가 advised된 객체가 주어진 인터페이스를 구현하도록 선언하고, 그 객체들을 대신하여 해당 인터페이스의 구현을 제공할 수 있게 합니다.
@DeclareParents 애노테이션을 사용하여 Introduction을 만들 수 있습니다. 이 애노테이션은 매칭되는 타입에 새로운 부모(즉, 새로운 인터페이스 구현)를 가지도록 선언하는 데 사용됩니다. 예를 들어, 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();
}
}
구현할 인터페이스는 애노테이션이 적용된 필드의 타입에 의해 결정됩니다. @DeclareParents 애노테이션의 value 속성은 AspectJ 타입 패턴을 사용합니다. 매칭되는 타입의 모든 빈은 UsageTracked 인터페이스를 구현하게 됩니다. 위 예제의 before advice에서 볼 수 있듯이, 서비스 빈은 UsageTracked 인터페이스의 구현체로 직접 사용할 수 있습니다. 빈을 프로그래밍 방식으로 접근할 때는 다음과 같이 작성할 수 있습니다:
UsageTracked usageTracked = context.getBean("myService", UsageTracked.class);
'Spring Framework > Aspect Oriented Programming with Spring' 카테고리의 다른 글
Choosing which AOP Declaration Style to Use (0) | 2024.11.17 |
---|---|
Proxying Mechanisms (1) | 2024.11.17 |
Declaring a Pointcut (0) | 2024.11.17 |
Declaring an Aspect (0) | 2024.11.17 |
Enabling @AspectJ Support (0) | 2024.11.17 |