여러 bean들 각각에 다른 advice 적용하는 방법입니다.

포인트컷으로 적용 대상을 골라 낼 수 있겠습니다.

    <aop:config>
        <aop:pointcut id=”serviceOperation”
                    expression=”execution(* x.y.service..*Service.*(..))“/>
        <aop:advisor pointcut-ref=”serviceOperation” advice-ref=”txAdvice”/>
    </aop:config>

    <!– these two beans will be transactional… –>
    <bean id=”fooService” class=”x.y.service.DefaultFooService”/>
    <bean id=”barService” class=”x.y.service.extras.SimpleBarService”/>

    <!– … and these two beans won’t –>
    <bean id=”anotherService” class=”org.xyz.SomeService”/> <!– (not in the right package) –>
    <bean id=”barManager” class=”x.y.service.SimpleBarManager”/> <!– (doesn’t end in ‘Service’) –>

    <tx:advice id=”txAdvice”>
        <tx:attributes>
            <tx:method name=”get*” read-only=”true”/>
            <tx:method name=”*”/>
        </tx:attributes>
    </tx:advice>

포인트컷으로 x.y.service 패키지의 Service가 들어가는 클래스로 범위를 좁혀서 트랜잭션을 적용하고 있습니다.

여러 개의 트랜잭션 설정이 필요하다면 다음과 같이 어드바이저를 여러개 만들면 됩니다.

    <aop:config>
        <aop:pointcut id=”defaultServiceOperation
                    expression=”execution(* x.y.service.*Service.*(..))“/>
        <aop:pointcut id=”noTxServiceOperation”
                    expression=”execution(* x.y.service.ddl.DefaultDdlManager.*(..))”/>
        <aop:advisor pointcut-ref=”defaultServiceOperation” advice-ref=”defaultTxAdvice“/>
        <aop:advisor pointcut-ref=”noTxServiceOperation” advice-ref=”noTxAdvice”/>
    </aop:config>

    <!– this bean will be transactional (see the ‘defaultServiceOperation’ pointcut) –>
    <bean id=”fooService” class=”x.y.service.DefaultFooService”/>

    <!– this bean will also be transactional, but with totally different transactional settings –>
    <bean id=”anotherFooService” class=”x.y.service.ddl.DefaultDdlManager”/>

    <tx:advice id=”defaultTxAdvice“>
        <tx:attributes>
            <tx:method name=”get*” read-only=”true”/>
            <tx:method name=”*”/>
        </tx:attributes>
    </tx:advice>
   
    <tx:advice id=”noTxAdvice”>
        <tx:attributes>
            <tx:method name=”*” propagation=”NEVER”/>
        </tx:attributes>
    </tx:advice>

각각의 트랜잭션 어드바이스가 적용될 포인트컷을 만들고 그 것들을 가지고 어드바이저로 조합해 두면 됩니다. 간단하네요.