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

标签 java spring

Spring 中有几个功能对我来说有点像黑匣子。 在本例中,我正在使用 websockets,并且 @Configuration 类使用需要实例化对象作为参数的重写方法来实现或扩展某些内容。

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {

    @Override
    public void configureMessageBroker(MessageBrokerRegistry registry) {
        registry.enableSimpleBroker("/topic");
        registry.setApplicationDestinationPrefixes("/app");
    }
}

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

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

最佳答案

这不仅适用于 @EnableWebSocketMessageBroker,也适用于任何其他 spring 配置。您需要了解的是,当您运行项目时,spring 创建所需的对象(在本例中为 MessageBrokerRegistry),注入(inject)它,然后将其传递给 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 Álvarez Feijoo 所指出的,您可以通过调试更好地理解它。

关于java - Spring配置类如何获取其方法所期望的对象实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50625645/

相关文章:

java - spring3构建错误

java - Hibernate中断异常

java - com.mysql.jdbc.MysqlDataTruncation : Data truncation: Data too long for column 'DATE' at row 1

java - Thymeleaf:检查是否定义了变量

java - 使用 Runtime.getRuntime().exec(command) 启动程序时遇到问题

java - Android AudioTrack getPlaybackHeadPosition 总是返回 0

java - Strassen 的算法归零

java - Java中不排序的自定义对象数组排序

java - 使用 @Service 构造型创建 XsrfProtectedServiceServlet 会引发 NullPointerException

java - 从 GitHub 加载 Maven 依赖项