在Grails

时间:2015-10-23 12:31:31

标签: grails dependency-injection grails-plugin

请注意:虽然我手边的具体问题涉及Grails Shiro插件,但我认为这是一个核心的 Grails问题。因此,无论Grails Shiro的经历如何,任何厌倦Grails退伍军人的战斗都应该能够回答这个问题。

使用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是Shiro王国。

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)的工作方式相同,就像在grails-app下定义的任何其他类一样。我只是不明白grails-app/*依赖注入是如何工作的。

1 个答案:

答案 0 :(得分:3)

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

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

请注意,如果领域类已注册为Spring bean,则使用@PostConstruct(或实现InitializingBean)将起作用,但在此情况下看起来并非如此插件。

我尽量避免使用Holders类,因为在大多数情况下,直接使用DI而不是明确地引入依赖关系,但看起来你需要在这里使用这种方法,例如fizzClient = Holders.applicationContext.fizzClient(假设已注册为" fizzClient" bean)。