5.5.2 Pointcut 선언 by sh

5.5.2. Pointcut 선언

<aop:config>요소 내에 명명 된 pointcut을 선언하여 포인트 컷 정의를 여러 aspect와 advisor에 공유 할 수 있습니다.

  • aspect : 공통 기능 (여러 클래스에 걸친 관심사의 모듈화)

  • joinpoint : advice를 적용해야 하는 부분 (스프링 AOP에서 joinpoint는 항상 메서드 실행을 의미) -> 메서드가 실행되는 중의 어떤 지점

  • advice : aspect 기능 자체 (특정 조인포인트에서 aspect가 취하는 행동 -> around, before, after, ... 등 여러 타입이 존재)

  • pointcut : joinpoint의 부분으로 실제로 advice가 적용된 부분

    • 조인포인트를 매칭하는 것 - advice는 표현식과 연결되고 포인트 컷이 매치한 조인 포인트에서 실행 된다.

    • 어떤 클래스의 어느 조인 포인트를 사용할 것 인지를 결정하는 기능.

    • 스프링은 기본적으로 AspectJ 포인트 컷 표현식 언어를 사용. AspectJ에서는 와일드카드를 이용한 메서드 시그니처를 사용한다.

  • weaving : advice를 핵심 기능에 적용하는 행위

서비스 계층에서 비즈니스 서비스의 실행을 나타내는 포인트 컷은 다음과 같이 정의 할 수 있습니다.

<aop:config>

    <aop:pointcut id="businessService"
        expression="execution(* com.xyz.myapp.service.*.*(..))"/>

</aop:config>

pointcut 표현식 자체는 @AspectJ support에 설명 된 것과 동일한 AspectJ pointcut 표현식 언어를 사용한다. 스키마 기반 선언 스타일을 사용하는 경우 pointcut 표현식에서 유형 (@Aspects)에 정의 된 명명 된 pointcuts를 참조 할 수 있습니다. 위의 pointcut을 정의하는 또 다른 방법은 다음과 같습니다.

<aop:config>

    <aop:pointcut id="businessService"
        expression="com.xyz.myapp.SystemArchitecture.businessService()"/>

</aop:config>

Sharing Common Pointcut Definitions에 설명 된대로 SystemArchitectureaspect가 있다고 가정합니다.

그런 다음 aspect 안에서 pointcut을 선언하는 것은 top-level pointcut을 선언하는 것과 매우 유사합니다.

<aop:config>

    <aop:aspect id="myAspect" ref="aBean">

        <aop:pointcut id="businessService"
            expression="execution(* com.xyz.myapp.service.*.*(..))"/>

        ...

    </aop:aspect>

</aop:config>

@AspectJ aspect와 같은 방식으로, 스키마 기반 정의 스타일을 사용하여 선언 된 pointcuts는 join point 컨텍스트를 수집 할 수있습니다. 예를 들어 다음 pointcut은이 객체를 join point 컨텍스트로 수집하여 advice에 전달합니다.

<aop:config>

    <aop:aspect id="myAspect" ref="aBean">

        <aop:pointcut id="businessService"
            expression="execution(* com.xyz.myapp.service.*.*(..)) &amp;&amp; this(service)"/>

        <aop:before pointcut-ref="businessService" method="monitor"/>

        ...

    </aop:aspect>

</aop:config>

다음과 같이 일치하는 이름의 매개 변수를 포함하여 수집 된 조인 포인트 컨텍스트를 수신하도록 advice를 선언해야합니다.

public void monitor(Object service) {
    ...
}

Ex. 아래 예제 설명!! (참조 사이트: http://blog.naver.com/PostView.nhn?blogId=sim4858&logNo=220938186901&redirect=Dlog&widgetTypeCall=true)

"logger" 라는 id를 가진 빈이 정의되어 있고,

그 logger 빈을 "myAspect"라는 id를 지정하여 공통 기능(aspect)으로 정의한다.

"selectSound"라는 id로 포인트 컷을 정의하고 있는데, 공통 기능(aspect)을 kr.ac.hansung.spring.aop 패키지 아래에 있는 모든 클래스들의 sound() 메소드에서 사용한다고 정의한다.

정의한 공통 기능(Logger 클래스의 aboutToSound 메소드)은 포인트 컷으로 설정된 sound() 메소드들이 실행되기 '전'에 동작하도록 advice를 정의하고 있다.

포인트 컷 하위 표현식을 결합 할 때 &&는 XML 문서 내에서 어색하기 때문에 &&, ||!대신에 and, ornot키워드를 각각 사용할 수 있습니다. 예를 들어, 이전의 pointcut은 다음과 같이 작성할 수 있습니다.

<aop:config>

    <aop:aspect id="myAspect" ref="aBean">

        <aop:pointcut id="businessService"
            expression="execution(* com.xyz.myapp.service..(..)) and this(service)"/>

        <aop:before pointcut-ref="businessService" method="monitor"/>

        ...
    </aop:aspect>
</aop:config>

이 방법으로 정의 된 pointcut는 XML id에 의해 참조되며, pointcuts라는 이름의 pointcut으로 사용되어 복합 pointcuts를 형성 할 수 없다. 따라서 스키마 기반 정의 스타일의 명명 된 pointcut 지원은 @AspectJ 스타일이 제공하는 것보다 더 제한적입니다.

Last updated