4

メインプロジェクトで@configurableの注釈が付けられたクラスでAspectJにロードタイムウィービングを実行させるのに問題があります。フィールドは設定されず、セッターもタッチされません。

構成を抽出して小さなサンドボックスプロジェクトでテストしたので、構成自体に問題はないと思います。念のため、この質問に含めます。

だから、私は疑問に思っています:

  1. 大規模なプロジェクトで、Spring / AspectJがこの特定のクラスを検出するのを妨げている可能性のあるものはありますか?
  2. 春が質問のクラスを認識しているかどうかを確認する方法はありますか?

そして最後に、私が抽出できるコードは何でも(難読化を許してください):

構成XMLから:

<context:annotation-config />
<context:spring-configured />
<context:component-scan base-package="se.isydev" />
<context:component-scan base-package="se.istools" />
<aop:aspectj-autoproxy />
<context:load-time-weaver aspectj-weaving="on" />
<context:property-placeholder location="classpath:settings.properties" />
(...)
<bean class="com.company.ClassToBeWeaved"
    scope="prototype">      
    <property name="injectedBean" ref="injectedBean" />
</bean>

そしてクラス自体:

@Configurable
public class ClassToBeWeaved {
    private InjectedBean injectedBean;

    @Required
    public void setInjectedBean() { ... }
}

編集:

まあ、循環依存のために機能していなかったことがわかりました。ああ、私はレガシーコードに取り組むのが大好きです。それでも、私の元の質問は残っています。

4

4 に答える 4

0

複数のSpring XMLファイルがありますか? <aop:aspectj-autoproxy /> が XML ファイルの「最も親」にないという問題があったと思います。

于 2009-12-29T18:33:03.823 に答える
0

LTW には、クラスパスに META-INF/aop.xml が必要だと思います。次のようになります。

<aspectj>
    <!--
        Uncomment this is you need AOP logging <weaver options="-verbose
        -showWeaveInfo
        -XmessageHandlerClass:org.springframework.aop.aspectj.AspectJWeaverMessageHandler">
    -->
    <weaver>
        <include within="com.xxx.MyClass" />
    </weaver>
    <aspects>
        <aspect name="org.springframework.beans.factory.aspectj.AnnotationBeanConfigurerAspect"/>
        <include within="org.springframework.beans.factory.aspectj.AnnotationBeanConfigurerAspect"/>
    </aspects>
</aspectj>
于 2009-09-08T14:35:38.127 に答える
0

「織る」ことを忘れているのかもしれません。コマンドラインに-javaagent:path/to/aspectjweaver.jaror を追加します。-javaagent:path/to/spring-agent.jar

@Autowireまた、依存関係を明示的に注入するのではなく、依存関係を維持することをお勧めします。

于 2009-09-07T15:05:11.603 に答える
0

あなたの質問に対するいくつかのヒント。

Spring でロード タイム ウィービングを機能させるには、 aop.xmlを適切に構成するだけでなく、spring-instrument.jarspring-aspects.jarも必要です。

これらの jar ファイルには、処理する Spring の側面を宣言する独自のaop.xmlが含まれています。

  • @トランザクションサポート
  • @構成可能なサポート
  • JPA 例外変換のサポート
  • スケジューリングをサポートする@Asyncアノテーション

バックグラウンドで何が起こっていますか?

AspectJ ロードタイム ウィービングを使用する場合、 @Transactionalおよび@Configurableの実装は、 JDK プロキシまたはCGLIB プロキシに基づくのではなく、実際の AspectJの側面に基づいています。

これらの実際の側面を有効にするには、追加の jar ファイルが必要です。jar には、独自の aop.xml にこれらの側面の宣言も含まれています。

Spring を AspectJ と統合する方法の詳細については、こちらをご覧ください

于 2012-02-08T14:40:44.900 に答える