在应用程序中,我们具有即时更新配置的功能。它会覆盖应用程序属性并调用:
((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)
你知道为什么会发生这种情况吗?
答案 0 :(得分:2)
我可以告诉你它为什么会发生。
我假设您在DelegatingFilterProxy
子类中注册WebApplicationInitializer
,可能是AbstractDispatcherServletInitializer
子类。
无论如何,此类完全独立于ApplicationContext
的操作。 Servlet容器扫描您的类路径并找到Spring的SpringServletContainerInitializer
,它找到您的WebApplicationInitializer
实现并运行它。然后注册DelegatingFilterProxy
,指定bean名称。
当第一个请求进入您的服务器时,DelegatingFilterProxy
将尝试在ApplicationContext
中找到其委托并将其设置为其委托字段。它仅在其当前委托为null
时执行此操作。因此刷新上下文不会影响它。
有可能的解决方案here。