5.5.4 인트로덕션 by sh

5.5.4. 인트로덕션

인트로덕션(AspectJ에서 inter-type 선언으로 알려짐)은 권고 된 객체가 주어진 인터페이스를 구현하고 해당 객체를 대신하여 해당 인터페이스의 구현을 제공한다는 것을 선언하는 aspect를 선언하게합니다.

aop:aspect내부에 aop:declare-parents요소를 사용하여 인드로덕션을를 할 수 있습니다. aop:declare-parents 요소를 사용하여 일치하는 유형에 새로운 부모 (따라서 이름)가 있음을 선언 할 수 있습니다. 예를 들어, UsageTracked라는 인터페이스와 DefaultUsageTracked라는 인터페이스의 구현이 주어졌을 때, 다음 aspect는 서비스 인터페이스의 모든 구현자가 또한 UsageTracked인터페이스를 구현한다고 선언합니다. (예를 들어 JMX를 통해 통계를 노출하기 위해)

<aop:aspect id="usageTrackerAspect" ref="usageTracking">

    <aop:declare-parents
        types-matching="com.xzy.myapp.service.*+"
        implement-interface="com.xyz.myapp.service.tracking.UsageTracked"
        default-impl="com.xyz.myapp.service.tracking.DefaultUsageTracked"/>

    <aop:before
        pointcut="com.xyz.myapp.SystemArchitecture.businessService()
            and this(usageTracked)"
            method="recordUsage"/>

</aop:aspect>

usageTracking빈을 뒷받침하는 클래스는 다음 메소드를 포함합니다.

public void recordUsage(UsageTracked usageTracked) {
    usageTracked.incrementUseCount();
}

구현할 인터페이스는 implement-interface속성에 의해 결정됩니다. types-matching 속성의 값은 AspectJ 유형 패턴이다. 일치하는 유형의 Bean은 UsageTracked인터페이스를 구현합니다. 이전 예제의 before advice에서 Service Bean은 UsageTracked인터페이스의 구현으로 직접 사용될 수 있습니다. 프로그램 적으로 Bean에 액세스하려면 다음처럼 작성할 수 있습니다.

UsageTracked usageTracked = (UsageTracked) context.getBean("myService");

Last updated