Spring @Transactional применяется как динамический Jdk-прокси и аспект aspectj - PullRequest
5 голосов
/ 26 августа 2010

Я нахожусь в процессе добавления декларативных транзакций Spring через аннотацию @Transactional в существующий проект Java.

Когда я столкнулся с проблемой (не связанной с этим вопросом), я включил полное ведение журнала отладки. Любопытно, что я заметил следующее:

17:47:27,834 DEBUG HibernateTransactionManager:437 - Found thread-bound Session [org.hibernate.impl.SessionImpl@10ed8a8e] for Hibernate transaction
17:47:27,845 DEBUG HibernateTransactionManager:470 - Participating in existing transaction
17:47:27,865 DEBUG AnnotationTransactionAttributeSource:106 - Adding transactional method 'updateUserProfile' with attribute: PROPAGATION_REQUIRED,ISOLATION_DEFAULT; ''
17:47:27,875 DEBUG AnnotationTransactionAspect:321 - Skipping transactional joinpoint [se.myservice.UserService.updateUserProfile] because no transaction manager has been configured

После некоторой отладки я обнаружил, что первые три записи журнала, в которых говорится, что он нашел сессию с привязкой к потоку и использует эту транзакцию, создаются JdkDynamicAopProxy в моем классе UserService.

Последнее сообщение журнала выглядит тревожным, хотя. Он вызывается в точке соединения перед выполнением метода. При поиске источника AnnotationTransactionAspect выдает это сообщение, если не установлен менеджер транзакций. В этом случае, потому что Spring никогда не выполняет никакого внедрения зависимости в этом аспекте.

Мне кажется, что применяются два разных "стиля" транзакций: динамический прокси и аспект. Единственная конфигурация, связанная с транзакциями, у меня есть:

<tx:annotation-driven transaction-manager="txManager" />

Мы используем AspectJ в проекте, но в моем файле aop.xml не зарегистрирован аспект AnnotationTransactionAspect. Мы используем Spring 3.0.2.RELEASE.

Должен ли я быть встревожен этим? Spring регистрирует этот аспект для меня? Разве я не должен использовать annotation-driven при использовании AspectJ?

Ответы [ 2 ]

8 голосов
/ 26 августа 2010

Странно, похоже, у вас есть эта конфигурация:

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

(поддержка транзакций с использованием AspectJ, а не JDK-прокси)

Поскольку ваша конфигурация не имеет атрибута mode, по умолчанию должен включиться (режим прокси). Но AnnotationTransactionAspect - это точный аспект, используемый режимом aspectj.

3 голосов
/ 26 ноября 2015

Для получения транзакций aspectj, работающих с конфигурацией java.

@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>

Если вы используете затмение, это гарантирует, что при развертывании внутри затмения будет выполнено переплетение:

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

...