Java 从groovy脚本获取Spring@Value

Java 从groovy脚本获取Spring@Value,java,spring,groovy,Java,Spring,Groovy,内部Java代码: @Value("${myVar}") private String myVar; Groovy代码内部: import org.springframework.beans.factory.annotation.Value; import groovy.transform.Field; @Field @Value('${myVar}') String myVar; return myVar; 返回null 如何从Groovy脚本中获取myVar,假设be

内部Java代码:

@Value("${myVar}") private String myVar;
Groovy代码内部:

import org.springframework.beans.factory.annotation.Value;
import groovy.transform.Field;
@Field @Value('${myVar}') String myVar;
return myVar;
返回null


如何从Groovy脚本中获取
myVar
,假设
bean
myVar
没有传入?

如果我理解正确,您希望Spring上下文在Groovy脚本执行期间可用,并对脚本属性执行通常的注入

Groovy脚本被编译成Groovy类,因此您应该能够简单地使用
beanFactory.autowireBean(this)
。但是,要获得对
BeanFactory
的引用,首先需要手动启动Spring上下文,如下所示:

new ClassPathXmlApplicationContext('path/to/applicationContext.xml').withCloseable { context ->

    context.autowireCapableBeanFactory.autowireBean(this)
    ... //the rest of your script goes here
}
(您可能需要调整
新的ClassPathXmlApplicationContext(“path/to/applicationContext.xml”)
part以满足您的需要,这取决于您喜欢使用什么方法来引导Spring上下文;此外,如果脚本是较大代码库的一部分,您可能希望创建一个比应用程序其余部分更小的应用程序上下文,以节省启动时间并避免常见的副作用。不过,这取决于使用情况)

我唯一不确定的是,在将变量转换为字段时,
@Field
是否保留了原始注释,但如果您没有收到任何错误,我会假设情况就是这样


如果不保留注释,则始终可以声明一个简单的带注释的POJO bean作为可注入属性的容器,并调用
def myPojo=new POJO();改为context.getBeanFactory()).autowireBean(myPojo)

您需要确保groovy脚本由spring管理,您可以在类上添加@Service或@Component注释。见下面的例子

@Service
class Demo {

  public @Value('${valueA}') String valueA

  String showValue() {
    return valueA
  }

}

您能展示一下groovy脚本的完整扩展吗?应该没有理由,为什么不能用groovy类进行这样的注释;除非你真的在谈论一个普通的脚本(我怀疑它到底是如何工作的),但是你是否也尝试过用
@Field
?它是一个普通的脚本。你能给出一个它应该是什么样子的示例吗?
@Field@Value…
-但是请提供一个完整的失败示例。我会被问到,你是如何运行这个groovy脚本的,这样spring上下文就可以处理它了。你回避了我关于spring和你的脚本是如何关联的问题。您认为spring会为您注入什么样的值呢?使用Pojo
public类MyClass{@value(${myVar}”)私有字符串myVar;public字符串getMyVar(){return myVar;}}}
在我执行
autowiebean
initializeBean
之后,
getMyVar
仍然返回null。没有Spring错误,因此我假设xml和属性文件是正常的。我遗漏了什么?没有看到项目设置就不确定了。脚本的类路径上是否存在
myVar
属性的源?