Spring配置类如何获取其方法所期望的对象实例?

JiK*_*Kra 2 java spring

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在哪里获得这些类的实例?

Shu*_*lag 7

这不仅适用于@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所指出的,你可以通过调试更好地理解它.