Spring 应用程序上下文重新加载不会更新由委托过滤器代理注册的 bean



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

((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 的过时过滤器过滤)

你知道为什么会发生这种情况如何摆脱这种情况吗?

我可以告诉你为什么会这样。

我假设您正在WebApplicationInitializer子类(也许是AbstractDispatcherServletInitializer子类)中注册您的DelegatingFilterProxy

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

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

这里有可能的解决方案。

最新更新