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

时间:2018-05-31 13:36:12

标签: java spring

Spring中有几个功能对我来说是一种黑盒子。 在这种情况下,我正在使用websockets,并且@Configuration类使用覆盖的方法实现或扩展某些东西,这些方法需要将实例化的对象作为参数。

with pytest.raises

方法configureMessageBroker需要MessageBrokerRegistry类的实例,但整个项目中没有任何bean配置。

我的问题是,Spring在哪里获得这些类的实例?

2 个答案:

答案 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已经拥有它们。

使用调试器可以更好地了解此行为。在您的方法中放置一个断点,然后查看调用堆栈。您可以进行逆向工程并查看如何调用方法。