6

spring-instrument.jar を使用して AspectJ LTW で Spring 3.0.6 を構成しました。

<context:load-time-weaver aspectj-weaving="on" weaver-class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver" />

依存関係から CGLIB を削除すると、MyBean が作成された (およびその @PostConstruct が実行された) 後でも、次の例外が発生します。

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'crawlItemService' defined in file [/path/to/project/foo/bar/MyBean.class]: Initialization of bean failed; nested exception is org.springframework.aop.framework.AopConfigException: Cannot proxy target class because CGLIB2 is not available. Add CGLIB to the class path or specify proxy interfaces.
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:527)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:291)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:288)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)
    at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.autowireResource(CommonAnnotationBeanPostProcessor.java:435)
    at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.getResource(CommonAnnotationBeanPostProcessor.java:409)
    at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor$ResourceElement.getResourceToInject(CommonAnnotationBeanPostProcessor.java:541)
    at org.springframework.beans.factory.annotation.InjectionMetadata$InjectedElement.inject(InjectionMetadata.java:147)
    at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:84)
    at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.postProcessPropertyValues(CommonAnnotationBeanPostProcessor.java:297)
    ... 72 more
Caused by: org.springframework.aop.framework.AopConfigException: Cannot proxy target class because CGLIB2 is not available. Add CGLIB to the class path or specify proxy interfaces.
    at org.springframework.aop.framework.DefaultAopProxyFactory.createAopProxy(DefaultAopProxyFactory.java:67)
    at org.springframework.aop.framework.ProxyCreatorSupport.createAopProxy(ProxyCreatorSupport.java:104)
    at org.springframework.aop.framework.ProxyFactory.getProxy(ProxyFactory.java:112)
    at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.createProxy(AbstractAutoProxyCreator.java:476)
    at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.wrapIfNecessary(AbstractAutoProxyCreator.java:362)
    at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.postProcessAfterInitialization(AbstractAutoProxyCreator.java:322)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsAfterInitialization(AbstractAutowireCapableBeanFactory.java:407)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1426)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519)
    ... 83 more

ロードタイムウィーバーが存在する場合でも、CGLIB を使用する必要があるということですか?

4

3 に答える 3

11

コードの調査と Spring Bean 定義の XML の変更に 3 時間以上を費やした後、私はついに問題を発見しました。これは、解決策を見つけた後に気づいたスタックトレースのこの部分から見つけることができます。

at org.springframework.scheduling.annotation.AsyncAnnotationBeanPostProcessor.postProcessAfterInitialization(AsyncAnnotationBeanPostProcessor.java:126)

ここのメモに基づいて、<aop:config><aop:aspectj-autoproxy>、およびですべての proxy-target-class 属性を false に変更しまし<tx:annotation-driven>たが、成功しませんでした。

次に、XML 定義の一部を削除して、この問題を解決するものを探し始めました。コメントが役に立ち<task:annotation-driven>、問題は解決しました。次に、この要素にはmode指定していない属性があることがわかりました。そのため、デフォルト値proxyが使用され、CGLIB が必要です。私が解決した問題を変更したのでmode="aspectj"

<task:annotation-driven scheduler="dataProviderScheduler" executor="dataProviderExecutor" mode="aspectj" />
于 2011-11-17T18:52:58.270 に答える
3

いいえ。ただし、AOP プロキシを作成する必要があります (ターゲット クラスをプロキシできません)。あなたのクラスは次のいずれかを持っていますか?

  • @Transactional
  • @Cacheable
  • @Async
  • ...

注釈?それとも、このクラスのメソッドに外部的な側面があるのでしょうか? それにもかかわらず、AspectJ コンパイラーはウィービングを処理する必要があり、AFAIR CGLIB は使用しないでください。コードを見せていただけますか?

私の場合、トランザクション サポートの読み込み時間のウィービングを正しく有効にするには、以下を追加する必要がありました。

 <context:load-time-weaver/>
 <tx:annotation-driven mode="aspectj"/>
 <aop:config proxy-target-class="true"/>

実際の例を見てください。

于 2011-11-17T16:45:21.820 に答える
2

Spring APO を使用している場合は、CGLIB を含める必要があります。これをプロジェクトに追加するには 2 つの方法があります

  1. CGLIB ライブラリ ファイルをダウンロードし、ライブラリ ファイルに追加します。 http://www.java2s.com/Code/Jar/c/Downloadcglib22jar.htm
  2. pom.xml ファイルに Maven 依存関係を追加します。

    https://mvnrepository.com/artifact/cglib/cglib/2.2.2


<dependency>
    <groupId>cglib</groupId>
    <artifactId>cglib</artifactId>
    <version>2.2</version>
</dependency>
于 2018-10-27T11:09:38.507 に答える