Spring: требуется ли CGLIB для внедрения конкретного класса с использованием @Resource - PullRequest
5 голосов
/ 17 ноября 2011

Я настроил Spring 3.0.6 с AspectJ LTW с использованием spring-instrument.jar и:

<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 даже при наличии ткача времени загрузки?

Ответы [ 3 ]

11 голосов
/ 17 ноября 2011

После более 3 часов изучения кода и изменения XML-определений bean-компонентов Spring я наконец нашел проблему.Это можно найти в этой части stacktrace, которую я заметил после нахождения решения:

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

На основании примечания здесь я изменил все атрибуты proxy-target-class на falseв <aop:config>, <aop:aspectj-autoproxy> и <tx:annotation-driven>, но безуспешно.

Затем я начал удалять части своего определения XML, чтобы найти, какая из них решает эту проблему.Комментирование <task:annotation-driven> помогло, и проблема решена.Затем я увидел, что у этого элемента есть атрибут mode, который я не указал, поэтому используется его значение по умолчанию proxy, и поэтому требуется CGLIB.Когда я изменил mode="aspectj", проблема решилась:

<task:annotation-driven scheduler="dataProviderScheduler" executor="dataProviderExecutor" mode="aspectj" />
3 голосов
/ 17 ноября 2011

Нет, но требуется для создания прокси AOP ( Невозможно целевой класс прокси ).Есть ли в вашем классе одно из:

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

аннотации?Или, может быть, есть какой-то внешний аспект вокруг методов этого класса?Тем не менее, компилятор AspectJ должен заботиться о переплетении, AFAIR CGLIB не должен использоваться.Можете ли вы показать нам свой код?

В моем случае, чтобы правильно включить переплетение времени загрузки для поддержки транзакций, мне пришлось добавить:

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

Взгляните на рабочий пример .

0 голосов
/ 27 октября 2018

Если вы используете Spring APO, вам нужно включить CGLIB. Есть два способа добавить это в ваш проект

  1. Загрузите файл библиотеки CGLIB и добавьте его в свои файлы библиотеки. http://www.java2s.com/Code/Jar/c/Downloadcglib22jar.htm
  2. Добавьте зависимость Maven в ваш файл pom.xml

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


<dependency>
    <groupId>cglib</groupId>
    <artifactId>cglib</artifactId>
    <version>2.2</version>
</dependency>
...