Java Spring:使用@Resource注入具体类是否需要CGLIB

Java Spring:使用@Resource注入具体类是否需要CGLIB,java,spring,aspectj,cglib,load-time-weaving,Java,Spring,Aspectj,Cglib,Load Time Weaving,我已经使用Spring-instrument.jar和以下工具配置了Spring 3.0.6和AspectJ LTW: <context:load-time-weaver aspectj-weaving="on" weaver-class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver" /> 这是否意味着即使存在加载时weaver,我也应该拥有CGLIB?否,但创建AOP代理(不

我已经使用Spring-instrument.jar和以下工具配置了Spring 3.0.6和AspectJ LTW:

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

这是否意味着即使存在加载时weaver,我也应该拥有CGLIB?

否,但创建AOP代理(不能代理目标类)是必需的。您的班级是否有:

  • @Transactional
  • @Cacheable
  • @Async
注释?或者这个类的方法可能有一些外部方面?尽管如此,AspectJ编译器应该注意编织,不应该使用AFAIR CGLIB。你能给我们看看你的密码吗

在我的例子中,为了正确启用事务支持的加载时编织,我必须添加:

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


.

在对代码进行了3个多小时的研究并更改了Springbean定义XMLs之后,我终于找到了问题所在。这可以从stacktrace的这一部分找到,我在找到解决方案后注意到:

at org.springframework.scheduling.annotation.AsyncAnnotationBeanPostProcessor.postProcessAfterInitialization(AsyncAnnotationBeanPostProcessor.java:126)
根据注释,我将
中的所有代理目标类属性更改为false,但没有成功

然后,我开始删除XML定义的一部分,以找出哪一部分可以解决这个问题。注释
帮助解决了问题。然后我看到这个元素有一个我没有指定的
mode
属性,所以使用了它的默认值
proxy
,所以需要CGLIB。当我更改
mode=“aspectj”
时,问题解决了:

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

如果您使用的是Spring APO,则需要包含CGLIB。 有两种方法可以将其添加到项目中

  • 下载CGLIB库文件并将其添加到库文件中。
  • 在pom.xml文件中添加Maven依赖项


  • 
    cglib
    cglib
    2.2
    
    您是代理一个接口还是一个类?正如前面提到的,它是一个具体的类。Spring将CGLIB用于其所有更现代的功能。没有它你走不了多远。哪些功能?我在LTW中使用了所有的JMX、调度、AOP、TX和IoC。而且:。是否仍需要有CGLIB?请参阅我的编辑。还可以快速阅读我的有关代理和事务的信息。您确定:。文档说明:属性:代理目标类是否要创建基于类的(CGLIB)代理?默认情况下,会创建基于Java接口的标准代理。不,我不确定,我只是从工作代码中复制了它。请尝试使用调试器。这肯定是错误的。参见“注释”伟大发现+1!那么您是否在某处使用了
    @Async
    注释?不应为没有此类方法的类生成CGLIB代理。谢谢,是的,我有
    @Async
    。如果您的异步方法不是从同一bean中的另一个方法调用的,那么CGLIB可以与
    @Async
    一起使用。(这是CGLIB的一个已知问题),但当您从另一个注入源bean的bean调用异步方法时,它会起作用。谢谢
    <task:annotation-driven scheduler="dataProviderScheduler" executor="dataProviderExecutor" mode="aspectj" />
    
    <dependency>
        <groupId>cglib</groupId>
        <artifactId>cglib</artifactId>
        <version>2.2</version>
    </dependency>