整天都在苦苦挣扎,所以我觉得是时候转向那些比我更有经验的人了。
我的应用程序使用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。这也让我相信事务管理器配置已经正确设置。
这两个方面是否可以互相打击/覆盖?应该如何避免这种情况?