有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

升级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) 个答案