Spring应用程序上下文重新加载不会更新DelegatingFilterProxy注册的bean

时间:2014-01-23 14:17:51

标签: java spring spring-mvc refresh applicationcontext

在应用程序中,我们具有即时更新配置的功能。它会覆盖应用程序属性并调用:

  ((ConfigurableApplicationContext)applicationContext).refresh();

我们还使用 DelegatingFilterProxy 将Spring bean注册为过滤器。

@Override
protected Filter[] getServletFilters() {
    DelegatingFilterProxy delegatingFilterProxy = new DelegatingFilterProxy("myFilter");
    delegatingFilterProxy.setContextAttribute(FrameworkServlet.SERVLET_CONTEXT_PREFIX + "dispatcher");

    return new Filter[] { delegatingFilterProxy };
}

当我重新加载application.properties时,我看到Spring重新创建所有bean,但DelegatingFilterProxy仍然使用第一个版本的过滤器bean(因此所有请求都被过时的过滤器过滤掉了陈旧的自动装配bean)

你知道为什么会发生这种情况吗?

1 个答案:

答案 0 :(得分:2)

我可以告诉你它为什么会发生。

我假设您在DelegatingFilterProxy子类中注册WebApplicationInitializer,可能是AbstractDispatcherServletInitializer子类。

无论如何,此类完全独立于ApplicationContext的操作。 Servlet容器扫描您的类路径并找到Spring的SpringServletContainerInitializer,它找到您的WebApplicationInitializer实现并运行它。然后注册DelegatingFilterProxy,指定bean名称。

当第一个请求进入您的服务器时,DelegatingFilterProxy将尝试在ApplicationContext中找到其委托并将其设置为其委托字段。它仅在其当前委托为null时执行此操作。因此刷新上下文不会影响它。

有可能的解决方案here