트랜잭션 어드바이스과 일반 어드바이스를 모두 적용하고 싶을 때 Order 인터페이스를 사용하여 순서를 지정할 수 있습니다.

   <bean id="profiler" class="x.y.SimpleProfiler">
        <!-- execute before the transactional advice (hence the lower order number) -->
        <property name="order" value="1"/>
    </bean>
   
    <tx:annotation-driven transaction-manager="txManager"/>

    <aop:config>
        <!-- this advice will execute around the transactional advice -->
        <aop:aspect id="profilingAspect" ref="profiler">
            <aop:pointcut id="serviceMethodWithReturnValue"
                          expression="execution(!void x.y..*Service.*(..))"/>
            <aop:around method="profile" pointcut-ref="serviceMethodWithReturnValue"/>
        </aop:aspect>
    </aop:config>

트랜잭션 처리를 어노테이션을 사용했기 때문에 XML 설정만 보고서는 순서를 예측할 수가 없습니다. 전부 XML로 설정한 예제를 보겠습니다.

    <!-- the profiling advice -->
    <bean id="profiler" class="x.y.SimpleProfiler">
        <!-- execute before the transactional advice (hence the lower order number) -->
        <property name="order" value="1"/>
    </bean>

    <aop:config>
       
        <aop:pointcut id="entryPointMethod" expression="execution(* x.y..*Service.*(..))"/>

        <!-- will execute after the profiling advice (c.f. the order attribute) -->
        <aop:advisor
                advice-ref="txAdvice"
                pointcut-ref="entryPointMethod"
                order="2"/> <!-- order value is higher than the profiling aspect -->

        <aop:aspect id="profilingAspect" ref="profiler">
            <aop:pointcut id="serviceMethodWithReturnValue"
                          expression="execution(!void x.y..*Service.*(..))"/>
            <aop:around method="profile" pointcut-ref="serviceMethodWithReturnValue"/>
        </aop:aspect>

    </aop:config>

    <tx:advice id="txAdvice" transaction-manager="txManager">
        <tx:attributes>
            <tx:method name="get*" read-only="true"/>
            <tx:method name="*"/>
        </tx:attributes>
    </tx:advice>

이번에는 트랜잭션 어드바이저의 order가 2 라는 것이 눈에 들어옵니다. 프로파일링 어스펙트의 order가 1이기 때문에 프로파일링 어드바이스가 먼저 적용이 될 것입니다.

의문이 드는건 왜 하나는 어드바이저 단위에 order를 설정하고 다른 하나는 어스펙트 단위에 order를 설정하였느냐 인데 트랜잭션 어드바이저 말고 커스텀 어드바이스들을 기본적으로 먼저 실행하겠다는 의도가 아닐까 생각해 봅니다.