在 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)。
请注意:虽然我手头的具体问题涉及 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)。