48

@ComponentScanBean を初期化し、 @EnableAspectJAutoProxy(proxyTargetClass=true)cglib プロキシを使用するために、 Java構成を使用しています。

このプロジェクトでは、生成された多くのサービスが を使用してそれらの間で自動配線されています@Autowired。それはかなりうまくいきます。

ただし、これらのサービスの一部については、追加しました (クラスに@Asyncも追加@EnableAsync(proxyTargetClass = true)しました)。@Configuration

その後、私は得ています:

Caused by: org.springframework.beans.factory.BeanCurrentlyInCreationException: Error creating bean with name 'ConversationUserLocalService': Bean with name 'ConversationUserLocalService' has been injected into other beans [ConversationUserHistoryLocalService] i
n its raw version as part of a circular reference, but has eventually been wrapped. This means that said other beans do not use the final version of the bean. This is often the result of over-eager type matching - consider using 'getBeanNamesOfType' with the 'a
llowEagerInit' flag turned off, for example.

@Asyncこれは、 AOP がプロキシを作成する前に、Spring がメソッドを使用してサービスを注入しているためだと思います。これが問題でしょうか?どのように修正すればよいですか?

私の問題を明確にするために、私が持っているとしましょう:

@サービスA、B、C;

A は B と C を自動配線し、B は A と C を自動配線し、C は A と B を自動配線しました。

C には、@Async としてマークされたメソッドがあります。

Spring が applicationContext を初期化するとき、A を初期化しようとしますが、B と C が必要なので、それらを初期化します。しかし、結局のところ、AOP は C のプロキシを作成しようとし (@Async のため)、C を B に自動配線し、A が C のプロキシと同じではないことを検出し、失敗します。

これにより、何が起こっているのかをもう少し説明できることを願っています。

4

4 に答える 4

48

@Lazy最後に、サービス ( で注釈が付けられたメソッド@Async)、自動配線された を使用して整理しました。このように、Spring は、アプリケーション コンテキストの初期化ではなく、必要なときにのみこれらのサービスを初期化して自動配線すると思います。

于 2015-03-11T18:28:21.537 に答える
11

AsyncConfigurer構成クラスは、アプリケーション コンテキスト ブートストラップの早い段階で初期化されます。そこに他の Bean への依存関係が必要な場合は、@Lazy他のポストプロセッサーも通過できるように、可能な限りそれらを宣言してください。

JavaDoc の参照: https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/scheduling/annotation/EnableAsync.html

于 2019-05-21T08:40:08.980 に答える