9.5.7. Advising transactional operations
트랜잭션 어드바이스과 일반 어드바이스를 모두 적용하고 싶을 때 Order 인터페이스를 사용하여 순서를 지정할 수 있습니다.
<!-- 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로 설정한 예제를 보겠습니다.
<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를 설정하였느냐 인데 트랜잭션 어드바이저 말고 커스텀 어드바이스들을 기본적으로 먼저 실행하겠다는 의도가 아닐까 생각해 봅니다.