gpt4 book ai didi

grails - 使用插件覆盖 Grails 服务 bean 定义

转载 作者:行者123 更新时间:2023-12-02 01:16:50 25 4
gpt4 key购买 nike

我想通过安装插件来覆盖服务实现 - 安装插件时我希望使用服务的插件版本,卸载插件时我希望使用服务的默认版本.

为了防止浪费时间,我将使用代码解释我的问题。我有一个由我的主应用程序和我的“自定义插件”共享的“通用插件”,其中包含以下内容:

public interface SimpleService {
void doProcessing();
}

然后我有一个包含以下内容的“主应用程序”

服务接口(interface)的默认实现:

public DefaultSimpleService implements SimpleService {
void doProcessing() {
// ...
}

资源.groovy:

simpleService(DefaultSimpleService) { bean ->
bean.autowire = 'byName'
}

使用该服务的 Controller :

class SimpleController {
def simpleService

def index() {
simpleService.doProcessing()
}
}

到目前为止一切顺利。我现在想做的就是通过安装一个插件来用新的接口(interface)替换 SimpleService 接口(interface)的实现。我不想更改应用程序中的任何配置。

我有一个带有新服务实现的插件:

public CustomSimpleService implements SimpleService {
void doProcessing() {
// ...
}
}

我的第一次尝试是在插件“doWithSpring”部分中注册自定义服务bean,但它总是被主应用程序覆盖。很公平,因为插件似乎总是在主应用程序 bean 注册之前加载(?)

我的第二次尝试是在 CustomServiceGrailsPlugin.groovy 内的“doWithApplicationContext”中注册自定义 bean:

def doWithApplicationContext = { applicationContext ->
DefaultListableBeanFactory beanFactory = (DefaultListableBeanFactory) applicationContext.getBeanFactory()
beanFactory.registerBeanDefinition("simpleService", BeanDefinitionBuilder.rootBeanDefinition(CustomSimpleService.class.getName()).getBeanDefinition())
}

这实际上部分起作用 - 当插件加载时,使用 SimpleService 的插件实现,如果卸载插件,则使用 SimpleService 的主应用程序实现。但有一个附带问题:bean 的 Autowiring 在“手动”注册的插件实现中不起作用...

然后我开始研究BeanPostProcessors,但从我读到的内容来看,它似乎无法解决我的问题。

那么我该如何解决我的问题呢?

问候托贝

最佳答案

我认为最好的办法是检查插件是否已安装,如果已安装,则不要在应用程序中声明该服务。

您可以检查安装的插件:org.codehaus.groovy.grails.plugins.PluginManagerHolder.pluginManager.allPlugins

您可以在 resources.groovy 中使用它

boolean containsPlugin(String pluginName) {
def names = org.codehaus.groovy.grails.plugins.PluginManagerHolder.pluginManager.allPlugins.collect { it -> return it.name }
return(pluginName in names)
}


beans = {
if(!containsPlugin("thePlugin")) {
println "Installation not contains plugin, defining bean!"
myService(...)
}
}

关于grails - 使用插件覆盖 Grails 服务 bean 定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15067132/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com