请注意:虽然我手边的具体问题涉及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/*
依赖注入是如何工作的。
答案 0 :(得分:3)
支持在grails-app
下定义类的插件通常通过定义新类型的工件来实现,并指定ArtefactHandler
实现来管理它。 Grails ArtefactHandlerAdapter
类实现了该接口,并提供了许多常用功能,因此经常使用,并在插件的RealmArtefactHandler class中使用。
将在newInstance
方法中配置依赖注入。你可以看到我为我的一个插件here做了这个。由于Shiro插件不会从基类覆盖该方法,因此看起来不支持依赖注入。
请注意,如果领域类已注册为Spring bean,则使用@PostConstruct
(或实现InitializingBean
)将起作用,但在此情况下看起来并非如此插件。
我尽量避免使用Holders
类,因为在大多数情况下,直接使用DI而不是明确地引入依赖关系,但看起来你需要在这里使用这种方法,例如fizzClient = Holders.applicationContext.fizzClient
(假设已注册为" fizzClient" bean)。