6

@Transactional アノテーションを介して Spring 宣言型トランザクションを既存の Java プロジェクトに追加しようとしています。

問題が発生したとき (この質問とは関係ありません)、完全なデバッグ ログをオンにしました。不思議なことに、私は次のことに気付きました。

17:47:27,834 DEBUG HibernateTransactionManager:437 - Hibernate トランザクションのスレッドにバインドされたセッション [org.hibernate.impl.SessionImpl@10ed8a8e] が見つかりました
17:47:27,845 DEBUG HibernateTransactionManager:470 - 既存のトランザクションに参加しています
17:47:27,865 DEBUG AnnotationTransactionAttributeSource:106 - 次の属性を持つトランザクション メソッド 'updateUserProfile' を追加します: PROPAGATION_REQUIRED,ISOLATION_DEFAULT; ''
17:47:27,875 DEBUG AnnotationTransactionAspect:321 - トランザクション マネージャーが構成されていないため、トランザクション ジョインポイント [se.myservice.UserService.updateUserProfile] をスキップしています

いくつかのデバッグの後、最初の 3 つのログ エントリ (スレッド バインド セッションが見つかり、そのトランザクションを使用している) が UserService クラスの JdkDynamicAopProxy によって生成されていることがわかりました。

ただし、最後のログ メッセージは驚くべきものに見えます。メソッド実行前のジョインポイントで呼び出されます。AnnotationTransactionAspect のソースを見ると、トランザクション マネージャーが設定されていない場合にこのメッセージが生成されます。この場合、Spring はこの側面で依存性注入を実行しないためです。

私には、トランザクションの 2 つの異なる「スタイル」が適用されているように見えます: 動的プロキシとアスペクトです。私が持っている唯一のトランザクション関連の構成は次のとおりです。

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

プロジェクトで AspectJ を使用していますが、aop.xml に AnnotationTransactionAspect アスペクトが登録されていません。Spring 3.0.2.RELEASE を使用しています。

私はこれに警戒すべきですか?Spring はこの側面を登録しますか? annotation-drivenAspectJ を使用する場合は使用しないでください。

4

2 に答える 2

8

奇妙なことに、次の構成になっているようです。

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

(JDKプロキシではなくAspectJを使用したトランザクションサポート)

構成にはmode属性がないため、デフォルトで開始する必要があります(プロキシモード)。ただし、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 に答える