Можно ли применить тег @Transactional к совету по аспектам?Я пытаюсь обернуть все вызовы уровня сервиса (com.mycompany.app.myapp.service. *) В транзакции, используя аспекты.Мой аспект заключается в том, чтобы правильно перехватывать вызовы уровня сервиса, но я не могу понять, как начать транзакцию.Я думал, что смогу применить тег @Transactional, и, поскольку у меня есть тег, он подхватит его и начнет транзакцию.Чего мне не хватает?
Конфигурация XML:
<bean id="systemArchitectureAspect" class="com.mycompany.app.myapp.aspect.SystemArchitecture"/>
<bean id="transactionAspect" class="com.mycompany.app.myapp.aspect.MyAspect"/>
<tx:annotation-driven transaction-manager="transactionManager" />
<bean id="transactionManager"
class="org.springframework.transaction.jta.JtaTransactionManager">
<property name="transactionManager" ref="AtomikosTransactionManager" />
<property name="userTransaction" ref="AtomikosUserTransaction" />
</bean>
<bean id="AtomikosTransactionManager" class="com.atomikos.icatch.jta.UserTransactionManager"
init-method="init" destroy-method="close">
<property name="forceShutdown" value="false" />
</bean>
<bean id="AtomikosUserTransaction"
class="com.atomikos.icatch.jta.UserTransactionImp">
<property name="transactionTimeout" value="10" />
</bean>
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="*" propagation="REQUIRED" />
</tx:attributes>
</tx:advice>
Аспект с / pointcuts:
package com.mycompany.app.myapp.aspect;
@Aspect
public class SystemArchitecture {
@Pointcut( "execution(* com.mycompany.app.myapp.service..*.*(..))" )
public void inServiceLayer() {};
@Pointcut( "execution(* com.mycompany.data..*.*(..))" )
public void inDataAccessLayer() {};
}
Совет, который я пытаюсь применить к моим pointcuts:
package com.mycompany.app.myapp.aspect;
@Aspect
public class TransactionAspect {
@Transactional
@Around( "com.mycompany.app.myapp.aspect.SystemArchitecture.inServiceLayer()" )
public Object interceptServiceLayer( ProceedingJoinPoint pjp ) throws Throwable
{
return pjp.proceed();
}
}