我正在通过 @Transactional 注释将 Spring 声明性事务添加到现有 Java 项目中。
当我遇到问题(与此问题无关)时,我打开了完整的调试日志记录。奇怪的是,我注意到以下内容:
17:47:27,834 调试 HibernateTransactionManager:437 - 为 Hibernate 事务找到线程绑定会话 [org.hibernate.impl.SessionImpl@10ed8a8e] 17:47:27,845 调试 HibernateTransactionManager:470 - 参与现有事务 17:47:27,865 调试 AnnotationTransactionAttributeSource:106 - 添加事务方法“updateUserProfile”,属性:PROPAGATION_REQUIRED,ISOLATION_DEFAULT;'' 17:47:27,875 调试 AnnotationTransactionAspect:321 - 跳过事务连接点 [se.myservice.UserService.updateUserProfile] 因为没有配置事务管理器
经过一些调试,我发现前三个日志条目(它说它找到了一个线程绑定会话并正在使用该事务)是由我的 UserService 类上的 JdkDynamicAopProxy 生成的。
不过,最后一条日志消息看起来令人震惊。它在方法执行之前的连接点处被调用。查看 AnnotationTransactionAspect 的源时,如果未设置事务管理器,它会生成此消息。在这种情况下,因为 Spring 从未在这方面执行任何依赖注入。
在我看来,两种不同的交易“风格”都被应用了:动态代理和方面。我拥有的唯一与事务相关的配置是:
<tx:annotation-driven transaction-manager="txManager" />
我们在项目中使用的是 AspectJ,但是我的 aop.xml 中没有注册 AnnotationTransactionAspect 方面。我们正在使用 Spring 3.0.2.RELEASE。
我应该对此感到震惊吗?Spring 是否为我注册了这方面?annotation-driven
使用 AspectJ 时不应该使用吗?