Spring AoP - TransactionManager(tx:advice)和自定义aspectJ编织建议 - 冲突?

时间:2014-01-29 15:46:39

标签: java spring aop aspectj spring-aop

整天都在苦苦挣扎,所以我觉得是时候转向那些比我更有经验的人了。

我的应用程序使用Spring和Hibernate。通过DAO对象持久化。

App具有Persistence和Business模块​​,Business模块​​依赖于Persistence。

DAO显然存在于持久层中。我的自定义方面位于业务层。

在持久层applicationContext.xml中:

<tx:advice id="txAdvice" transaction-manager="transactionManager">
    <tx:attributes>
        <tx:method name="create" propagation="REQUIRED" isolation="DEFAULT" read-only="false" />
        <tx:method name="read" propagation="REQUIRED" isolation="DEFAULT" read-only="true" />
        <tx:method name="update" propagation="REQUIRED" isolation="DEFAULT" read-only="false" />
        <tx:method name="delete" propagation="REQUIRED" isolation="DEFAULT" read-only="false" />
        <tx:method name="executeFinder" propagation="REQUIRED" isolation="DEFAULT" read-only="true" />
        <tx:method name="executeLister" propagation="REQUIRED" isolation="DEFAULT" read-only="true" />
        <tx:method name="executeUpdate" propagation="REQUIRED" isolation="DEFAULT" read-only="false" />
    </tx:attributes>
</tx:advice>

<aop:config>
       <aop:pointcut id="genericManagerMethods" expression="execution(public * foo.bar.dao.impl.GenericDaoHibernateImpl.*(..))" />
       <aop:advisor advice-ref="txAdvice" pointcut-ref="genericManagerMethods" />
</aop:config>
业务层applicationContext.xml中的

<!-- Activate aop weaving, currently only for provider resolving. -->
<aop:aspectj-autoproxy>
    <aop:include name="tenantAspect"/>
</aop:aspectj-autoproxy>
<bean id="tenantAspect" class="foo.bar.aspects.ProviderAspect"/>

最后,ProviderAspect.java类:

@Aspect
public class ProviderAspect {

private static Logger LOGGER = LoggerFactory.getLogger(VitalityProviderAspect.class);

@Before(value = "execution(* foo.bar.dao.impl.GenericDaoHibernateImpl.create(..))")
public void addTenantId(JoinPoint joinPoint) throws Exception {
    LOGGER.debug("In the aspect!!")
}

现在是奇怪的......

在我的集成测试中,业务模块中的test-applicationContext不包含事务建议。当我的集成测试运行时,AspectJ编织的建议会得到适当的应用。因此,我知道我的AspectJ配置是正确的。

当构建和部署项目(现在使用完整的应用程序上下文)时,AspectJ编织的建议似乎被忽略,并且只应用了tx:advice。我甚至没有显示任何错误,它似乎没有应用ProviderAspect。这也让我相信事务管理器配置已经正确设置。

这两个方面是否可以互相打击/覆盖?应该如何避免这种情况?

0 个答案:

没有答案