当前位置: 首页 > 知识库问答 >
问题:

Spring根应用程序上下文和servlet上下文混淆

崔单弓
2023-03-14

我知道我需要在servlet上下文中注册用@controller注释的类,以使webapp可访问。通常,我会按照以下方式来做:

@Configuration
@EnableWebMvc
@ComponentScan({"foo.bar.controller"})
public class WebConfig extends WebMvcConfigurerAdapter {
    //other stuff like ViewResolvers, MessageResolvers, MessageConverters, etc.
}

添加到根应用程序上下文中的所有其他配置类。下面是我的dispatcher初始值设定项通常的样子:

public class DispatcherServletInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class<?>[] { RootConfig.class, ServiceConfig.class };
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class<?>[] { WebConfig.class };
    }

    @Override
    protected String[] getServletMappings() {
        return new String[] { "/" };
    }
}

但是当我开始使用WebSockets时,事情变得更有趣了。要使websockets工作,必须将WebSoketConfig.class放到servlet上下文中。下面是我的WebSocketConfig示例:

@Configuration
@EnableScheduling
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/chat").withSockJS();
    }

    @Override
    public void configureClientInboundChannel(ChannelRegistration channelRegistration) {
        channelRegistration.taskExecutor().corePoolSize(4).maxPoolSize(8);
    }

    @Override
    public void configureClientOutboundChannel(ChannelRegistration channelRegistration) {
        channelRegistration.taskExecutor().corePoolSize(4).maxPoolSize(8);
    }

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

}
@Service
public class TimeServiceWsImpl implements TimeServiceWs {

    @Autowired
    private SimpMessagingTemplate messagingTemplate;

    @Override
    public void sentCurrentTime() {
        long currentTime = System.currentTimeMillis();
        String destination = "/topic/chatty";
        logger.info("sending current time to websocket /topic/time : " + currentTime);
        this.messagingTemplate.convertAndSend(destination, currentTime);
    }
}
    null

如果你需要任何额外的信息,请告诉我。

共有1个答案

廉宇
2023-03-14

大多数Spring MVC应用程序都有一个包含所有服务层/DAO层bean的根上下文,以及应用程序的每个Spring dispatcher servlet的一个servlet上下文,其中包含(至少)每个servlet的控制器。

这个想法是,一个应用程序可能有几个servlet分派器,例如一个用于URL/shopping/*,另一个用于URL/reporting/*,每个分派器都有自己的控制器集。

一个servlet调度程序的控制器是相互隔离的,这意味着尽管它们也是Spring bean,但它们不能相互注入。

根上下文被称为控制器servlet上下文/上下文的父上下文。

这一切都是为了将bean组相互隔离,以确保不可能有任何不必要的依赖。

考虑到这一点,并通过问题:

 类似资料:
  • 我正在阅读spring framework文档,现在我正在讨论应用程序范围概念。关于这个概念的文档是这样说的: 这有点类似于Spring单例bean,但有两个重要的区别:它是每个ServletContext的单例,而不是每个Spring ApplicationContext的单例 对我来说,不清楚的是我们如何想象Spring应用程序上下文和Servlet上下文之间的关系。 那么,Spring应用程

  • 我多年来一直在使用Spring MVC,我试图理解与Spring Boot的一些关键区别。 你能帮我确认一下吗?或者让我明白我在这里遗漏了什么?

  • 问题内容: 我正在研究 Spring MVC ,所以我有一些疑问 因此,我有这个配置类,用于配置处理用户请求的 DispatcherServlet : 我很清楚 DispatcherServlet的 工作方式。我的怀疑与 上下文 概念有关。 1)确切表示 上下文 ?我认为这就像一组具有特定用途的豆类,可以在环境中工作。但是我绝对不正确。 2) 根上下文 和 调度程序servlet上下文有 什么区别

  • 我正在学习Spring MVC,我有一些相关的疑问 因此,我有这个配置类来配置处理用户请求的DispatcherServlet: 3)根据我的理解,在dispatcherContext中定义的bean可以访问在rootContext中定义的bean(但相反的情况并非如此)。为什么? TNX

  • Spring Boot对于如何使用Spring构建应用程序有一个看法:例如它具有常规配置文件的常规位置,以及用于常见管理和监视任务的端点。Spring Cloud建立在此之上,并添加了一些可能系统中所有组件将使用或偶尔需要的功能。 引导应用程序上下文 一个Spring Cloud应用程序通过创建一个“引导”上下文来进行操作,这个上下文是主应用程序的父上下文。开箱即用,负责从外部源加载配置属性,还解

  • 据我所知,基于Spring的web应用程序初始化如下: 步骤1:定位的实现,即。 步骤2:< code > SpringServletContainerInitializer 创建< code>DispatcherServlet和< code > context loader listener 第3步:创建。创建。 步骤 1 由 Servlet 3.0 规范定义。步骤2,3完全由Spring定义。