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方法吗?
好的,使用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还是应用于创建的对象.
| 归档时间: |
|
| 查看次数: |
5514 次 |
| 最近记录: |