Java 从groovy调用Spring组件
我有一个基于spring的java应用程序,其中包含一些有用的组件。作为系统的一部分,我有一个groovy脚本来处理一些报告。我想从groovy脚本调用spring组件。 当我用Java编写时,我需要在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
@组件中使用@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);