@ComponentScan
Bean を初期化し、 @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 のプロキシと同じではないことを検出し、失敗します。
これにより、何が起こっているのかをもう少し説明できることを願っています。