升级Spring版本时出现java ApplicationListener问题
我有一个应用程序,它使用FactoryBean
创建ApplicationListener
(创建过程很复杂,所以我为它创建了一个FactoryBean
),并且FactoryBean.isSingleton()
返回true
在Spring3中,它的作用就像魅力一样,但现在我正在升级到Spring5.3,但它不起作用。我诊断了很多,我在org.springframework.context.support.ApplicationListenerDetector
课上发现了
该类中有两个方法
@Override
public void postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, Class<?> beanType, String beanName) {
if (ApplicationListener.class.isAssignableFrom(beanType)) {
this.singletonNames.put(beanName, beanDefinition.isSingleton());
}
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) {
if (bean instanceof ApplicationListener) {
// potentially not detected as a listener by getBeanNamesForType retrieval
Boolean flag = this.singletonNames.get(beanName);
if (Boolean.TRUE.equals(flag)) {
// singleton bean (top-level or inner): register on the fly
this.applicationContext.addApplicationListener((ApplicationListener<?>) bean);
}
else if (Boolean.FALSE.equals(flag)) {
if (logger.isWarnEnabled() && !this.applicationContext.containsBean(beanName)) {
// inner bean with other scope - can't reliably process events
logger.warn("Inner bean '" + beanName + "' implements ApplicationListener interface " +
"but is not reachable for event multicasting by its containing ApplicationContext " +
"because it does not have singleton scope. Only top-level listener beans are allowed " +
"to be of non-singleton scope.");
}
this.singletonNames.remove(beanName);
}
}
return bean;
}
虽然myFactoryBean.isSingleton()
返回true
,但是第一个方法不会为FactoryBean
返回的bean调用,因此第二个方法不会在ApplicationContext
中注册ApplicationListener
所以现在我想看看是Spring5.3的一个it缺陷,还是我在升级Spring版本时错过了一些额外的东西
共 (0) 个答案