Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从groovy调用Spring组件_Java_Spring_Groovy_Autowired - Fatal编程技术网

Java 从groovy调用Spring组件

Java 从groovy调用Spring组件,java,spring,groovy,autowired,Java,Spring,Groovy,Autowired,我有一个基于spring的java应用程序,其中包含一些有用的组件。作为系统的一部分,我有一个groovy脚本来处理一些报告。我想从groovy脚本调用spring组件。 当我用Java编写时,我需要在@组件中使用@Autowired注释,即 @Component class Reporter{ @Autowired SearchService searchService; void report(){ searchService.search(...); ... } } 如何在groo

我有一个基于spring的java应用程序,其中包含一些有用的组件。作为系统的一部分,我有一个groovy脚本来处理一些报告。我想从groovy脚本调用spring组件。 当我用Java编写时,我需要在
@组件中使用
@Autowired
注释,即

@Component
class Reporter{
@Autowired
SearchService searchService;

void report(){
 searchService.search(...);
 ...
}
}
如何在groovy中实现同样的功能? 首先,如何为整个脚本定义
@Component
? 以下代码:

@Component class Holder{
    @Autowired
    SearchService searchService;

    def run(){
        searchService.search("test");
    }
}

new Holder().run()
NPE打开
searchService
时失败。 如果有必要的话,我正在使用从Java安装的
GroovyClassloader
运行GroovyScript。
提前多谢

如果您使用的是
@Component
,则应将Spring上下文创建为:

def ctx = new GenericApplicationContext()
new ClassPathBeanDefinitionScanner(ctx).scan('') // scan root package for components
ctx.refresh()
或在XML中:

<context:component-scan base-package="org.example"/>
三种可能性:

  • 如果您的Groovy代码可以预编译并包含在类路径中,那么它将像任何其他bean一样在
    期间被创建和注入。听起来可能不是这样,因为您使用的是
    GroovyClassLoader

  • 使用Spring并使用
    来创建bean,而不是使用
    GroovyClassLoader
    。然后使用
    插入属性,而不是使用
    @Autowired

  • 如果您仍然需要使用
    GroovyClassLoader
    ,那么可以使用
    autowirednotationbeanpostprocessor
    请求注入bean

  • 例如,如果
    obj
    是对
    GroovyClassLoader
    创建的对象的引用:

    AutowiredAnnotationBeanPostProcessor aabpp =
        (AutowiredAnnotationBeanPostProcessor)applicationContext.
            getBean(AnnotationConfigUtils.AUTOWIRED_ANNOTATION_PROCESSOR_BEAN_NAME);
    
    aabpp.processInjection(obj);
    

    还有第四种可能性,但我不确定它是否能与
    GroovyClassLoader
    一起使用。

    spring应用程序上下文是如何创建的?非常感谢,这正是我所需要的。顺便说一句,我注意到创建和刷新上下文需要一些时间。也许将spring上下文作为参数传递给groovy脚本会更好,不是吗?您当然可以尝试,但上下文仍然需要刷新(例如,
    @Autowired
    要工作+其他事情),感谢这个答案,目前在web上最有用:D然而,在用组件注释Groovy类并在构造函数中插入3行关于上下文的内容之后,我仍然无法自动连接Spring项目中的服务。它告诉我它似乎错过了配置(liquibase config),但我有我的application.yml文件nice and lean:(非常感谢您的回复。据我所知,当我们需要在groovy中实现bean时,您的答案很有用,对吗?目前,我只想从groovy脚本调用现有组件,因此它现在对我没有用处。但我将保存您的答案以供以后参考。
    AutowiredAnnotationBeanPostProcessor aabpp =
        (AutowiredAnnotationBeanPostProcessor)applicationContext.
            getBean(AnnotationConfigUtils.AUTOWIRED_ANNOTATION_PROCESSOR_BEAN_NAME);
    
    aabpp.processInjection(obj);