使用Spring IoC在Guava EventBus中自动注册bean

fra*_*acz 5 java spring vaadin guava event-bus

假设我的应用程序中有一个语言更改事件接口(它基于Vaadin):

public interface ILanguageChangeListener{
    @Subscribe onLanguageChange(LanguageChangeEvent event);
}
Run Code Online (Sandbox Code Playgroud)

我有很多bean实现了这个用@Component注释的接口,因此它们可以在Spring IoC中使用.我还有一个EventBus bean:

<bean id="languageSwitcher" class="com.google.common.eventbus" scope="session" />
Run Code Online (Sandbox Code Playgroud)

现在,在从IoC获取任何bean的实例之后,我还必须得到一个languageSwitcher的实例,并在其中注册newely创建的bean:

languageSwitcher.register(myNewBean);
Run Code Online (Sandbox Code Playgroud)

为了接收这个事件.有可能以某种方式告诉IoC我想在每个实现ILanguageChangeListener的新bean上调用languageSwitcher bean的register方法吗?

Eld*_*ael 9

好的,使用BeanPostProcessor,注册接口的每个bean:

public class EventBusRegisterBeanPostProcessor implements BeanPostProcessor,
        ApplicationContextAware {

    private ApplicationContext context;

    @Autowired
    private EventBus eventBus; // The only event bus i assume...

    public Object postProcessBeforeInitialization(Object bean, String beanName)
            throws BeansException {

        return bean;
    }

    public Object postProcessAfterInitialization(Object bean, String beanName)
            throws BeansException {

        if (bean instanceof ILanguageChangeListener) {
            registerToEventBus(bean);
        }

        return bean;
    }

    private void registerToEventBus(Object bean) {
        this.eventBus.register(bean);
    }

    public void setApplicationContext(ApplicationContext applicationContext)
            throws BeansException {
        this.context = applicationContext;
    }

}
Run Code Online (Sandbox Code Playgroud)

请注意,如果您有许多EventBus bean,则应使用它ApplicationContext.getBean(String)来获取所需的EventBus.

我引用javadoc:

对于FactoryBean,将为FactoryBean实例和FactoryBean创建的对象(从Spring 2.0开始)调用此回调.后处理器可以通过相应的Bean instanceof FactoryBean检查来决定是应用于FactoryBean还是应用于创建的对象.