Spring中有几个功能对我来说是一种黑盒子.在这种情况下,我正在使用websockets,并且@Configuration类使用覆盖的方法实现或扩展某些东西,这些方法需要将实例化的对象作为参数.
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
registry.enableSimpleBroker("/topic");
registry.setApplicationDestinationPrefixes("/app");
}
}
Run Code Online (Sandbox Code Playgroud)
方法configureMessageBroker需要MessageBrokerRegistry类的实例,但整个项目中没有任何bean配置.
我的问题是,Spring在哪里获得这些类的实例?
这不仅适用于@EnableWebSocketMessageBroker,也适用于任何其他弹簧配置.您需要了解的是,当您运行项目时,spring会创建所需的对象,在本例中为MessageBrokerRegistry,将其注入,然后将其传递给configureMessageBroker并调用该方法.这就是您将@Configuration注释添加到类的原因.该注释告诉spring在spring初始化期间初始化相关环境.
另一个例子:
@Configuration
@EnableWebMvc
public class AppConfig extends WebMvcConfigurerAdapter {
@Bean
public ViewResolver viewResolver() {
InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
viewResolver.setViewClass(JstlView.class);
viewResolver.setPrefix("/WEB-INF/views/");
viewResolver.setSuffix(".jsp");
return viewResolver;
}
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
}
Run Code Online (Sandbox Code Playgroud)
现在我们需要DefaultServletHandlerConfigurer,它由spring完全创建和管理.confateDefaultServletHandling()方法被覆盖,我们启用默认的servlet处理程序.这将让其他http请求(例如.css,.js)通过通常的DispatcherServlet,让容器处理它们.所以现在我们可以从WebApp文件夹中提供静态文件css和javascript.
简而言之,@ Configuration告诉spring设置环境,因此使用@Configuration注释的类中的所有方法都是用于初始化的,并且仅用于管理spring.
正如EstherÁlvarezFeijoo所指出的,你可以通过调试更好地理解它.
| 归档时间: |
|
| 查看次数: |
264 次 |
| 最近记录: |