Spring中有几个功能对我来说是一种黑盒子。 在这种情况下,我正在使用websockets,并且@Configuration类使用覆盖的方法实现或扩展某些东西,这些方法需要将实例化的对象作为参数。
with pytest.raises
方法configureMessageBroker需要MessageBrokerRegistry类的实例,但整个项目中没有任何bean配置。
我的问题是,Spring在哪里获得这些类的实例?
答案 0 :(得分:6)
这不仅适用于@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();
}
}
现在我们需要DefaultServletHandlerConfigurer,它由spring完全创建和管理。重写了configureDefaultServletHandling()方法,我们启用了默认的servlet处理程序。这将让其他http请求(如.css,.js)通过通常的DispatcherServlet,让容器处理它们。所以现在我们可以从WebApp文件夹中提供静态文件css和javascript。
简而言之,@ Configuration告诉spring设置环境,因此使用@Configuration注释的类中的所有方法都是用于初始化的,并且仅用于管理spring。
正如EstherÁlvarezFeijoo所指出的,你可以通过调试更好地理解它。
答案 1 :(得分:2)
@Configuration也将该类注释为@Component(参见@Configuration的代码,它有该注释)。这样,IoC容器中就可以使用WebSocketConfig的实例。 方法" configureMessageBroker"因为这个而没有神奇地调用,而且参数" MessageBrokerRegistry注册表"没注射。它只是一个常规方法,任何具有类实例的人都可以调用,传递合适的参数
运行应用程序时,在弹出初始化的某个步骤中,spring需要配置Web套接字实用程序,并将查找" AbstractWebSocketMessageBrokerConfigurer"或某些或其接口的实现。它会找到你的类实例,并将它用于该配置,将必要的参数传递给方法,因为Spring已经拥有它们。
使用调试器可以更好地了解此行为。在您的方法中放置一个断点,然后查看调用堆栈。您可以进行逆向工程并查看如何调用方法。