【问题标题】:Grails: plugin injecting service into src groovy within a pluginGrails:插件将服务注入到插件中的 src groovy
【发布时间】:2014-10-31 16:32:46
【问题描述】:

抱歉,因为那里有很多链接,我已经尝试了一些示例,包括已经在我的项目中工作的非插件的东西:

我尝试过的:

在我的插件描述符中:

def doWithSpring = {
        someService(SomeService)
    }

然后在我的结尾 src/groovy

//def someService = Holders.grailsApplication.mainContext.getBean 'someService'
def someService

以上都不起作用...

如果我实例化该服务,一切似乎都可以正常工作,我宁愿注入它,而且它只需要花费大量时间来做一些相当基本的事情:(

SomeService someService=new SomeService()

任何帮助将不胜感激

我以前从未见过它(在插件中)我应该在其中包含 conf/spring/resources.groovy 并初始化 bean 吗?

【问题讨论】:

标签: grails


【解决方案1】:

在这种情况下,与大多数情况一样,有一种方法可以在不使用持有人的情况下访问您想要的内容。 Groovy 类实现了ServletContextListener,因此有一个带有ServletContextEvent 事件的contextInitialized 方法,其中包含ServletContext。所以没有必要使用ServletContextHolder 来获取ServletContext - 它就在那里。从FAQ 可以看出,Spring ApplicationContext 作为属性存储在ServletContext 中。一旦你有了它,你就可以访问任何你想要的 Spring bean;在这种情况下,jenkinsServicegrailsApplication bean(您可以直接从 grailsApplication 获取配置,而无需为此使用 Holders

我进行了这些更改并进行了大量清理工作,并发送了一个拉取请求。

【讨论】:

  • 谢谢伯特。你是我的英雄:)
【解决方案2】:

您可以像这样在src/groovy 类中注入您的服务:

import com.example.SomeService
import grails.util.Holders

class SrcGroovy {

    SomeService someService = Holders.applicationContext.getBean("someService")

    // ...
}

【讨论】:

  • 谢谢肯,会试试这个,它看起来和我上面的版本有点不同
  • 这导致了一些奇怪的问题 - src/groovy 文件是一个端点,它返回:404 并且未声明纯文本文档的字符编码。 ...
  • 这不是注入,而是拉入外部资源。 Rod 和 Spring 团队花了所有时间使用依赖注入和控制反转来开发一个很棒的框架,现在我们要回到旧的方式。不,不是我 :)
  • @Burt,如果没有你,学习成为一名更好的 Grails 开发人员会很困难。当我阅读@vahid 的问题时,我想到了一个实现HttpSessionListener 的案例,正如您所指出的,我不需要Holders 类,因为我可以访问HttpSessionEvent。如果你有一个有几个不同方法的类,每个方法都可以访问ServletContext,你会使用Holders 拉入外部资源一次,还是在每个方法中使用servletContext.getAttribute(GA.APPLICATION_CONTEXT)?是使用 toMAYtoes 还是 toMAtoes 的情况?
  • @BurtBeckwith。我一直在做一些重构。这篇文章 (burtbeckwith.com/blog/?p=993) 仍然是在域类中获取 grailsApplication 的首选技术吗?
猜你喜欢
  • 2016-01-30
  • 2012-05-25
  • 2016-02-22
  • 1970-01-01
  • 2012-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-20
相关资源
最近更新 更多