装饰Grails提供的Spring bean

多纳尔

我知道我可以通过用相同的名称定义自己的bean来替换Grails提供的Spring bean。例如,如果我想替换messageSourceGrails提供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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Grails 2.4.2 bean spring bean注入

来自分类Dev

Spring bean定义-获取bean类

来自分类Dev

在groovy bean中注入Spring bean

来自分类Dev

Spring bean定义-获取bean类

来自分类Dev

Spring bean GeoModule bean注入到RepositoryRestMvcConfiguration

来自分类Dev

使用Grails BeanBuilder或Spring GenericGroovyApplicationContext“手动”创建bean

来自分类Dev

将Activiti作为Grails中的Spring Bean进行布线

来自分类Dev

Spring Bean autowiring

来自分类Dev

Spring Fallback bean实现

来自分类Dev

分析Spring bean定义

来自分类Dev

Spring SingletonBeanFactoryLocator销毁bean

来自分类Dev

Spring无法创建bean

来自分类Dev

Lucene的Spring Bean配置

来自分类Dev

Spring Integration Bean错误

来自分类Dev

Spring bean的Singleton实现

来自分类Dev

Bean集合Spring:ConversionNotSupportedException

来自分类Dev

Spring SingletonBeanFactoryLocator销毁bean

来自分类Dev

Spring bean的执行顺序

来自分类Dev

Spring @Autowired bean给空

来自分类Dev

Spring原型bean混淆

来自分类Dev

配置 Spring bean

来自分类Dev

使用 grails bean 定义将闭包传递给 spring bean

来自分类Dev

如何按条件在Spring中提供默认bean?

来自分类Dev

Spring Hateoas @EnableEntityLinks不提供EntityLinks bean(NoSuchBeanDefinitionException)

来自分类Dev

是/如何从托管Spring Bean向线程提供SecureContext

来自分类Dev

Spring @Autowired在@Repository bean中提供了空值

来自分类Dev

如何按条件在Spring中提供默认bean?

来自分类Dev

是/如何从托管Spring Bean向线程提供SecureContext

来自分类Dev

Spring MVC bean验证问题