我想通过仅安装插件来覆盖服务实现 - 安装插件时,我希望使用服务的插件版本,当卸载插件时,我希望使用服务的默认版本。
为了避免浪费时间,我将使用代码来解释我的问题。我有一个由我的主应用程序和我的“自定义插件”共享的“通用插件”,其中包含以下内容:
public interface SimpleService {
void doProcessing();
}
然后我有一个“主应用程序”,其中包含以下内容
服务接口的默认实现:
public DefaultSimpleService implements SimpleService {
void doProcessing() {
// ...
}
资源.groovy:
simpleService(DefaultSimpleService) { bean ->
bean.autowire = 'byName'
}
使用服务的控制器:
class SimpleController {
def simpleService
def index() {
simpleService.doProcessing()
}
}
到目前为止,一切都很好。我现在要做的就是SimpleService
通过安装一个插件来用一个新的接口替换实现。我不想更改我的应用程序中的任何配置。
我有一个带有新服务实现的插件:
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 的自动装配在“手动”注册的插件实现中不起作用......
然后我开始看,BeanPostProcessors
但从我读到的内容看来它不能解决我的问题。
那么我该如何解决我的问题呢?
问候托比