我目前正在开发一个使用Spring MVC和Spring Websocket的Spring Web应用程序。配置是基于注释的。我使用 AbstractAnnotationConfigDispatcherServletInitializer 类作为初始化程序,我对我应该提供的servlet映射以及我应该这样做的方式感到困惑。
我希望将所有MVC控制器映射到" / webservices /"路径,我的Websocket端点位于" / websockets /"。
在我的 @Configuration 类中,一个用于配置Spring MVC( @EnableWebMVC ),另一个用于Spring WebSocket( @EnableWebSocketMessageBroker EM>)。
我按如下方式实现了我的初始化程序:
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class[] {WebMVCConfiguration.class, WebSocketConfiguration.class};
}
@Override
protected String[] getServletMappings() {
return new String[]{"/webservices/*","/websockets/*"};
}
另请注意,我通过在Root Configuration类上使用 @Import 导入了所有配置类。我不确定是否应该导入MVC和Websocket配置,因为我已经在getServletConfigClasses()方法中声明了它们......但是我做到了。
无论如何,直到现在它一直很好用。但我最近在我的应用程序中添加了@PropertySource注释的使用(通过使用 @Value(&#34; $ {}&#34;)表达式来注入我的应用程序属性),并且谢谢我注意到至少WebSocket配置类是......扫描(?)两次:第一次正确注入@Value字段值,但不是第二次(导致错误) )。
在进行故障排除时,我注意到我没有这样做&#34;双重扫描&#34;当我从getServletConfigClasses()方法中删除WebSocketConfiguration类时出现问题:它只被扫描一次,并且正确地注入了属性valye。让我感到惊讶的是,即使没有在getServletConfigClasses()中声明WebSocketConfiguration,&#34; / websockets&#34;端点仍然有效!我的猜测是,由于我的Root配置类上的 @Import ,它被扫描了......但是Spring知道它应该如何将WebSocketConfiguration绑定到&#34; / websockets&#34;路径?
所有这些让我想知道我何时/如何导入配置类。所以这是我的问题:
感谢您的帮助!