所以我创建了一个插件,介绍了一个自定义的人工制品" 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
答案 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
}
}
我希望有所帮助。