6

我正在通过 @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 时不应该使用吗?

4

2 回答 2

8

奇怪,听起来你有这样的配置:

<tx:annotation-driven
    transaction-manager="transactionManager" mode="aspectj" />

(使用 AspectJ 的事务支持,而不是 JDK 代理)

由于您的配置没有模式属性,因此默认应该启动(代理模式)。但是 AnnotationTransactionAspect 正是 aspectj 模式使用的切面。

于 2010-08-26T09:33:28.883 回答
4

使用 java config 获取 aspectj 事务。

@EnableWebMvc
@Configuration
@ComponentScan("com.yourdomain")
@EnableTransactionManagement(mode=AdviceMode.ASPECTJ)
public class ApplicationConfig extends WebMvcConfigurerAdapter {

    @Bean
    public LocalContainerEntityManagerFactoryBean entityManagerFactory() {

        //...
    }

    @Bean
    public JpaTransactionManager transactionManager() {

        JpaTransactionManager bean = new JpaTransactionManager(entityManagerFactory().getObject());
        return bean ;
    }

    @Bean
    public AnnotationTransactionAspect annotationTransactionAspect() {

        AnnotationTransactionAspect bean = AnnotationTransactionAspect.aspectOf();
        bean.setTransactionManager(transactionManager());
        return bean;
    }
}

如果您使用的是 Maven:

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>aspectj-maven-plugin</artifactId>
    <version>1.7</version>
    <configuration>
        <aspectLibraries>
            <aspectLibrary>
                <groupId>org.springframework</groupId>
                <artifactId>spring-aspects</artifactId>
            </aspectLibrary>
        </aspectLibraries>
        <complianceLevel>1.8</complianceLevel>
        <source>1.8</source>
        <target>1.8</target>
        <showWeaveInfo>true</showWeaveInfo>
    </configuration>
    <executions>
        <execution>
            <goals>
                <goal>compile</goal>
            </goals>
        </execution>
    </executions>
</plugin>

如果您使用的是 eclipse,这将确保在 eclipse 中部署时完成编织:

http://www.eclipse.org/ajdt/

于 2015-11-26T11:37:35.990 回答