spring - 为什么我不能让 Spring 加载时间编织工作

标签 spring groovy spring-annotations load-time-weaving

我一直在尝试让一个示例 @Configuration 构建工作(在 groovy 中),这样我就可以在 spring 容器之外触发依赖注入(inject),但我得到的只是关于 -javaagent 的错误,我似乎无法修复

我有一个像这样的 beanConfig 类

@配置 @EnableSpringConfigured//应该打开 AnnotationBeanConfigurerAspect @EnableLoadTimeWeaving (aspectjWeaving=AspectJWeaving.ENABLED)//开启这个上下文 类 BeanConfig {

然后是一个示例类,我将调用 new on 并尝试让注入(inject)取代 spring 容器,其中 diSource bean 在上面的配置类中声明

` @Configurable (autowire=Autowire.BY_TYPE, dependencyCheck=true) 类 ExtDI { @Autowired DISource diSource

def say () {
    println "ExtDI : diSource set as " + diSource.name
}
}

`

在我的采样器类中,我调用它来尝试触发注入(inject)

` ... 静态无效主要(字符串[]参数){ AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(/BeanConfig.class/) ctx.scan ("com.softwood") ctx.刷新() ....

    //trigger LTW injection
    ExtDI ext = new ExtDI()
    ext.say()

`

在类路径上,我有 aspectjeaver-1.6.10.jar、aspectjrt-1.6.10.jar、spring-xxx-3.1.4.jars 等 这是我的 gradle 依赖列表

依赖关系{ 编译'org.codehaus.groovy:groovy-all:2.1.7' 编译组:'commons-collections',名称:'commons-collections',版本:'3.2' testCompile 组:'junit',名称:'junit',版本:'4.+' 编译“org.springframework:spring-core:${spring_version}” 编译“org.springframework:spring-beans:${spring_version}” 编译“org.springframework:spring-context:${spring_version}” 编译“org.springframework:spring-aspects:${spring_version}” 编译“org.springframework:spring-aop:${spring_version}” 编译“org.springframework:spring-instrument:${spring_version}” 编译“org.aspectj:aspectjrt:1.6.10” 编译“org.aspectj:aspectjweaver:1.6.10” 编译“cglib:cglib:2.2” }

在我拥有的 vm args 的 eclipse 项目运行时 -javaagent:C:/Users/802518659/aspectjweaver-1.6.10.jar

并尝试使用 spring-instrument-3.1.4.jar 进行同样的操作,但遇到了同样的问题。

当我运行这个项目时,我得到了这个错误

`

Oct 19, 2013 4:02:40 PM org.springframework.context.support.AbstractApplicationContext prepareRefresh
INFO: Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@492ff1: startup date [Sat Oct 19 16:02:40 BST 2013]; root of context hierarchy
Oct 19, 2013 4:02:40 PM org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons
INFO: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@11bedb0: defining beans [org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,beanConfig,willsBean,org.springframework.context.annotation.ConfigurationClassPostProcessor.importAwareProcessor,org.springframework.context.annotation.aspectj.SpringConfiguredConfiguration,org.springframework.context.config.internalBeanConfigurerAspect,org.springframework.context.annotation.LoadTimeWeavingConfiguration,loadTimeWeaver,publicBean,privateBean,publicBeanWithDI,myDISource,diTarget]; root of factory hierarchy
Oct 19, 2013 4:02:40 PM org.springframework.beans.factory.support.DefaultSingletonBeanRegistry destroySingletons
INFO: Destroying singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@11bedb0: defining beans [org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,beanConfig,willsBean,org.springframework.context.annotation.ConfigurationClassPostProcessor.importAwareProcessor,org.springframework.context.annotation.aspectj.SpringConfiguredConfiguration,org.springframework.context.config.internalBeanConfigurerAspect,org.springframework.context.annotation.LoadTimeWeavingConfiguration,loadTimeWeaver,publicBean,privateBean,publicBeanWithDI,myDISource,diTarget]; root of factory hierarchy
Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'loadTimeWeaver' defined in class path resource [org/springframework/context/annotation/LoadTimeWeavingConfiguration.class]: Instantiation of bean failed; nested exception is org.springframework.beans.factory.BeanDefinitionStoreException: Factory method [public org.springframework.instrument.classloading.LoadTimeWeaver org.springframework.context.annotation.LoadTimeWeavingConfiguration.loadTimeWeaver()] threw exception; nested exception is java.lang.IllegalStateException: ClassLoader [sun.misc.Launcher$AppClassLoader] does NOT provide an 'addTransformer(ClassFileTransformer)' method. Specify a custom LoadTimeWeaver or start your Java virtual machine with Spring's agent: -javaagent:org.springframework.instrument.jar
    at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:581)
...

`

这告诉我我的应用程序无法检测 java 类加载器 - 尽管我使用 -javaagent:spring-instrument-xxx 或 aspectjweaver.jar 启动它 - 都失败了

那么我做错了什么 - 这真的开始困扰我 - 我可以在上下文中进行普通注入(inject)工作(没有 LTW)但我真的想让容器外的注入(inject)工作

我做错了什么

最佳答案

花了一些时间,但弄清楚哪里出了问题

已在 spring 论坛的另一篇文章中更正,请参阅 http://forum.spring.io/forum/spring-projects/container/724426-cant-get-aspectj-load-time-weaving-to-work

我还在这里为我的博客添加了一个更长的注释

http://willwoodman.wordpress.com/

关于spring - 为什么我不能让 Spring 加载时间编织工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19467870/

相关文章:

java - 在 Spring 4.2 中注入(inject)静态变量

javascript - 如何通过url传递特殊字符 '/'

rest - SOAPUI 错误 : Attempted read from closed stream for JSON POST to redirect to GET after 302

java - Spring @Value 空列表默认

java - Spring RequestBody 与 Postman 测试

java - 如何在方法声明上使用 @around spring aop 注释?

java - 无法在spring工具中下载maven依赖项

java - 如何将文件从SpringBoot项目资源内的子文件夹复制到资源内的另一个子文件夹

gradle - 在 gradle 的插件扩展中传递闭包

groovy - 如何在 JIRA 脚本运行器 groovy 中运行 shell 命令