Java 使用Groovy配置提供的Spring动态语言支持

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

我想使用Spring框架,从Groovy脚本创建一个可重新加载的bean(,在运行时!)。我希望避免
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
      }