Java 使用Groovy配置提供的Spring动态语言支持
我想使用Spring框架,从Groovy脚本创建一个可重新加载的bean(,在运行时!)。我希望避免Java 使用Groovy配置提供的Spring动态语言支持,java,spring,groovy,spring-boot,spring-annotations,Java,Spring,Groovy,Spring Boot,Spring Annotations,我想使用Spring框架,从Groovy脚本创建一个可重新加载的bean(,在运行时!)。我希望避免xml配置,并在springboot应用程序上下文中使用注释(或类似内容) 这是对的扩展,扩展是我确实想用BeanPostProcessors,处理程序,解析器,不管做什么都可以 我已经快速查看了的javadoc,并给出了一些工作示例。我想知道为什么Application.groovy(v2)不工作 beans.xml-有效!(但我想在Application.groovy中定义bean,而不是x
xml
配置,并在springboot
应用程序上下文中使用注释(或类似内容)
这是对的扩展,扩展是我确实想用BeanPostProcessors
,处理程序
,解析器
,不管做什么都可以
我已经快速查看了的javadoc,并给出了一些工作示例。我想知道为什么Application.groovy(v2)
不工作
beans.xml-有效!(但我想在Application.groovy中定义bean,而不是xml
…)
Application.groovy(v1)-有效!(但这是一个非常丑陋的解决办法)
@springboot应用程序
公共类应用程序{
公共静态void main(字符串[]args){
SpringApplication应用程序=新的SpringApplication(应用程序)
//准备应用程序后添加GroovyScriptFactory。。。
addListeners(新的ApplicationListener-刷新带注释的Groovy控制器会导致ClassCastException
-版本2.5及更高版本中的标记不适用于可刷新的Spring MVC端点
-在@Configuration classes中添加对动态语言可刷新bean的支持
更简单的选择:
- 将FooBarService放在类路径上,并用@Component注释它
或
- 使用mybeans.xml中的lang名称空间
-
你为什么不干脆
@Bean
ScriptFactoryPostProcessor scriptFactory() {
ScriptFactoryPostProcessor sfpp = new ScriptFactoryPostProcessor()
sfpp.setDefaultRefreshCheckDelay(1000)
return sfpp
}
感谢@slim-l的备选方案,但不幸的是,您的两个解决方案都没有解决我的问题(除非我弄错了,否则它们不能重新加载)。您的第一个备选方案没有使用。您的第二个备选方案缺少刷新检查延迟=“1000”
属性,并且还使用了我想避免使用的xml
。包含了一个使用Java配置的示例。这对您有用吗?为什么不使用RefreshableResourceScriptSource
?@ApproxiValue-这是一个很好的示例,但它需要一个包装Bean类(即计算器
)动态调用底层的ScriptEvaluator
。当我想添加一个新函数“subtract”时会发生什么?我必须向计算器添加新方法并手动重新编译类吗?不是很动态。理想情况下,我想要的是Groovy脚本/类,它的更改可以由Spring在运行时检测和更新,Spring本身就是一个Springbean(以及它附带的所有自动连接魔法)。设想一个可以在运行时动态更新和添加的@RestController
。它似乎可以从Groovy脚本生成可刷新的bean:
@SpringBootApplication
@ImportResource("classpath:mybeans.xml")
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application, args)
}
}
@Bean
ScriptFactoryPostProcessor scriptFactory() {
ScriptFactoryPostProcessor sfpp = new ScriptFactoryPostProcessor()
sfpp.setDefaultRefreshCheckDelay(1000)
return sfpp
}