我知道我可以通过用相同的名称定义自己的bean来替换Grails提供的Spring bean。例如,如果我想替换messageSource
Grails提供的bean
class MyMessageSource implements MessageSource {
// methods omitted
}
然后在以下内容中添加 resources.groovy
messageSource(MyMessageSource)
但是,假设我要MyMessageSource
装饰Grails提供的此bean的实现。
class MyMessageSource implements MessageSource {
// this field should be set to the MessageSource impl provided by Grails
MessageSource messageSource
}
我不知道该如何将其连接起来resources.groovy
。显然我不能这样做:
messageSource(MyMessageSource) {
messageSource = ref('messageSource')
}
因为看起来我正在定义一个依赖于自身的bean。我当然可以给我的豆起一个不同的名字,例如
myMessageSource(MyMessageSource) {
messageSource = ref('messageSource')
}
但是,然后任何超出我控制范围的类(例如,插件类)声明了依赖关系,messageSource
都将被设置为Grails提供的bean,而不是我的装饰器。
在一个应用程序(不是插件)中,应该遵循这些原则。
新消息源:
// src/groovy/com/demo/MyMessageSource.groovy
package com.demo
import org.springframework.context.MessageSource
import org.springframework.context.MessageSourceResolvable
import org.springframework.context.NoSuchMessageException
class MyMessageSource implements MessageSource {
MessageSource theRealMessageSource
String getMessage(String code, Object[] args, String defaultMessage, Locale locale) {
theRealMessageSource.getMessage code, args, defaultMessage, locale
}
String getMessage(String code, Object[] args, Locale locale) throws NoSuchMessageException {
theRealMessageSource.getMessage code, args, locale
}
String getMessage(MessageSourceResolvable resolvable, Locale locale) throws NoSuchMessageException {
theRealMessageSource.getMessage resolvable, locale
}
}
后处理器:
// src/groovy/com/demo/MyPostProcessor.groovy
package com.demo
import org.springframework.beans.factory.config.BeanFactoryPostProcessor
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory
import org.springframework.beans.BeansException
class MyPostProcessor implements BeanFactoryPostProcessor {
@Override
void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
// error handling ommitted for brevity here...
def realMessageSource = beanFactory.getBean('messageSource')
def newMessageSource = new MyMessageSource()
newMessageSource.theRealMessageSource = realMessageSource
beanFactory.removeBeanDefinition 'messageSource'
beanFactory.registerSingleton 'messageSource', newMessageSource
}
}
注册后处理器:
// grails-app/conf/spring/resources.groovy
beans = {
myMessageSourcePostProcessor com.demo.MyPostProcessor
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句