如何将服务动态注入grails自定义工件中

时间:2014-08-15 15:25:53

标签: grails grails-2.0 grails-plugin

所以我创建了一个插件,介绍了一个自定义的人工制品" Guard" (护卫班位于:/ grails-app / guards)。现在我的插件通过使grailsApplication知道新的人工制品来工作。因此,如果我调用grailsApplication.getGuardClasses(),行为将按预期执行。

我的问题是我希望能够动态地将服务注入到我的防护类中,如下所示:

Class ExampleGuard {

     def exampleService

}

我在这个网站上找到了一个静态解决方案的解决方案,可以是Holders,也可以是应用程序上下文来获取bean的名称。这不是我想要的,因为我基本上希望这可以自动连接,当人们使用我的插件时,他们可以使用动态注入保护类中的服务。

更新: 这就是我访问Guard类的方式。

def guard = grailsApplication.getArtefact("Guard","marketplace.TestGuard").newInstance()

调用.newInstance()会使类中的所有字段无效,包括注入的spring bean,这就是注入的类将为null的原因:

assert guard.sampleService == null

1 个答案:

答案 0 :(得分:1)

如果您的插件发现了所有Guard类并将它们添加到spring应用程序上下文中,那些bean将自动受到依赖注入。这就是所有内置工件的工作方式以及插件提供的工件如何工作,例如Quartz Jobs。

编辑:

作为一个例子...

class GuardsPlugin {

    // ...

    def doWithSpring = {
        application.guardClasses.each { guardClass ->
            "${guardClass.propertyName}"(guardClass.clazz) { bean ->
                bean.autowire = "byName"
            }
        }
    }
}

然后,如果你有一个像MySpecialGuard这样的类,并且你从控制器(例如)中引用了类似这样的东西......

class MyController {
    def mySpecialGuard

    def someAction() {
        // mySpecialGuard should be DI'd into this
        // controller and mySpecialGuard should itself
        // have been subjected to DI
    }
}

我希望有所帮助。