java - Spring:使用@Resource注入(inject)具体类是否需要CGLIB

标签 java spring aspectj cglib load-time-weaving

我已经使用 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?

最佳答案

经过 3 个多小时的代码调查和更改 Spring bean 定义 XML,我终于找到了问题所在。这可以从stacktrace的这一部分找到,这是我找到解决方案后注意到的:

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

基于笔记here ,我在 <aop:config> 中将所有代理目标类属性更改为 false , <aop:aspectj-autoproxy> , 和 <tx:annotation-driven> , 但没有成功。

然后我开始删除我的 XML 定义的一部分,以找出哪一个可以解决这个问题。发表评论 <task:annotation-driven>帮助并解决了问题。然后我看到这个元素有一个 mode我没有指定的属性,所以它的默认值,proxy , 被使用,因此需要 CGLIB。因为我改变了 mode="aspectj"问题解决了:

<task:annotation-driven scheduler="dataProviderScheduler" executor="dataProviderExecutor" mode="aspectj" />

关于java - Spring:使用@Resource注入(inject)具体类是否需要CGLIB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8170875/

相关文章:

Java Spring JdbcTemplate

java - 临时文件未找到文件异常

debugging - 如何知道 Spring 生成的 bean 中的 bug 所在行?

java - 尝试为包含变量的任何方法匹配 AspectJ 切入点签名

java - Java中Jar方法的单元测试

Java base64编码,解码产生不同的结果

java - 为什么在调用class.NewInstance()时使用InvokeVirtual而不是InvokeSpecial?

java - 使用Aspectj查找实现某个接口(interface)的类列表

spring - Aspectj - 拦截 HTTP 请求

java - 使用类的对象来获取对其内容的引用的术语或习惯用法是什么?