![](/img/trans.png)
[英]Spring application context has my bean but @autowired doesn't see it
[英]Spring application context reloading doesn't update bean registered by DelegatingFilterProxy
在应用程序中,我们具有即时更新配置的功能。 它会覆盖应用程序属性并调用:
((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(因此所有请求都被过时的过滤器过滤掉过时的autowired bean)
你知道为什么会发生这种情况吗?
我可以告诉你为什么会这样。
我假设您在WebApplicationInitializer
子类中注册DelegatingFilterProxy
,可能是AbstractDispatcherServletInitializer
子类。
无论如何,这个类完全独立于ApplicationContext
的动作。 Servlet容器扫描您的类路径并找到Spring的SpringServletContainerInitializer
,它找到您的WebApplicationInitializer
实现并运行它。 然后注册DelegatingFilterProxy
指定bean名称。
当第一个请求进入您的服务器时, DelegatingFilterProxy
将尝试在ApplicationContext
查找其委托并将其设置为其委托字段。 它仅在其当前委托为null
。 因此刷新上下文不会影响它。
有可能的解决方案在这里 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.