在 Grails 中注入 grails-app 类

Injecting grails-app classes in Grails

请注意:虽然我手头的具体问题涉及 Grails Shiro 插件,但我认为这是一个核心 Grails 问题 在心里。因此,任何厌倦了战斗的 Grails 老手 都应该 能够回答这个问题,无论他们使用 Grails Shiro 的经验如何。


使用 Grails Shiro 插件(通过 grails shiro-quick-start)在 grails-app/realms 下生成 Shiro realm class。例如,运行:

grails shiro-quick-start --prefix=com.example.me.myapp.Mongo

...将产生:

myapp/
    grails-app/
        realms/
            com/
                me/
                    myapp/
                        MongoDbRealm.groovy

其中MongoDbRealm为四郎境

package com.example.me.myapp

class MongoDbRealm {
    FizzClient fizzClient // How to inject?
    BuzzClient buzzClient // How to inject?
    FooFactory fooFactory // How to inject?

    // lots of auth-centric, generated code here...
}

假设 MongoDbRealm 非常复杂,需要注入很多复杂的对象,例如服务客户端和工厂等。如何正确注入 MongoDbRealm ?

@PostConstruct 会在这里工作吗?我可以像处理控制器一样将 Grails 服务注入其中吗?还有别的吗?


再次,我想依赖注入在这里(使用 Grails Shiro 和我的 MongoDbRealm)与在下面定义的任何其他 class 中一样工作grails-app。我只是不明白 grails-app/* 依赖注入是如何工作的。

支持在 grails-app 下定义 classes 的插件通常通过定义一种新类型的工件来实现,并指定一个 ArtefactHandler 实现来管理它。 Grails ArtefactHandlerAdapter class 实现了该接口并提供了很多常用功能,因此经常使用,并用于插件的 RealmArtefactHandler class.

依赖注入将在 newInstance 方法中配置。你可以看到我在哪里为我的一个插件做了这个 here。由于 Shiro 插件没有从基础 class 覆盖该方法,因此看起来不支持依赖注入。

请注意,如果领域 classes 已注册为 Spring bean,则使用 @PostConstruct(或实施 InitializingBean)将起作用,但它看起来不像这个插件就是这种情况。

我尽量避免使用 Holders class 因为在大多数情况下使用 DI 比显式引入依赖更简单,但看起来你需要在这里使用这种方法,例如fizzClient = Holders.applicationContext.fizzClient(假设注册为 "fizzClient" bean)。