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

奥列克西(Oleksii Duzhyi)

我知道我需要@Controller在servlet上下文中注册带注释的类,以使我的webapp可访问。通常,我通过以下方式进行操作:

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

我添加到根应用程序上下文中的所有其他配置类。这是我的调度程序初始化程序通常的样子:

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[] { "/" };
    }
}

但是当我开始使用WebSocket时,事情变得越来越有趣。要使Websocket工作,必须将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);
    }
}

我需要在其他一些服务中使用此服务(将其自动布线)。现在我陷入僵局:

  1. 如果我想TimeServiceWs在根应用程序上下文中创建bean,则按预期不会看到SimpMessagingTemplatebean并抛出NoSuchBeanDefinitionException
  2. 如果我试图TimeServiceWs在servlet上下文中创建bean,则无法将其自动连接到任何其他服务,因为根上下文看不到servlet上下文bean(据我所知)
  3. 如果我将所有配置都移到servlet上下文,则所有bean都已成功创建,但是出现以下异常:java.lang.IllegalStateException: No WebApplicationContext found并且无法访问我的Web应用程序

我应该做些什么?根上下文内应该是什么?servlet上下文内部应该是什么?您能否再澄清一下这些上下文之间的区别?

如果您需要任何其他信息,请告诉我。

角形大学

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

其想法是,一个应用程序可能具有多个servlet调度程序,例如一个用于URL /shopping/*,另一个用于URL /reporting/*,每个调度器都有自己的一组控制器。

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

根上下文中的服务层和DAO Bean在所有Servlet上下文中都是可见的,因此可以在任何控制器中注入服务层Bean,但不能以其他方式注入。

根上下文被称为控制器Servlet上下文的父级。

所有这一切都是要使一组豆相互隔离的机制,以确保不会产生不协调的依赖关系。

鉴于此并经历了以下问题:

  • 如果我试图在根应用程序上下文中创建TimeServiceWs Bean,则按预期不会看到SimpMessagingTemplate Bean并抛出NoSuchBeanDefinitionException:将SimpleMessagingTemplate移到根上下文中,这是一个像DAO一样的bean,可以在应用程序中的任何地方使用,因此它应该在共享根上下文中。

  • 如果要在servlet上下文中创建TimeServiceWs Bean,则无法将其自动连接到任何其他服务:如果要自动连接到其他服务,则将其保留在根上下文中。

    -如果我将所有配置都移到servlet上下文,则所有的bean都创建成功,但是我得到java.lang.IllegalStateException:没有找到WebApplicationContext:进行相反的操作,基本上将所有bean移到根上下文,仅保留在servlet上下文中特定于应用程序那部分的bean,很多时候只有控制器。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

从Spring安全性上下文访问应用程序上下文

来自分类Dev

Spring递归加载应用程序上下文

来自分类Dev

Spring应用程序上下文为null

来自分类Dev

在单元测试中启动和关闭Spring应用程序上下文

来自分类Dev

Spring应用程序-应用程序上下文IOC

来自分类Dev

无法在 Spring Boot 应用程序中加载应用程序上下文

来自分类Dev

Spring MVC Web应用程序中的根上下文和调度程序Servlet上下文到底是如何?

来自分类Dev

重新加载或刷新测试方法中的Spring应用程序上下文?

来自分类Dev

Spring 4中的差异应用程序上下文

来自分类Dev

从应用程序上下文中删除Spring Bean

来自分类Dev

多次导入同一spring应用程序上下文文件

来自分类Dev

以编程方式将Bean添加到Spring应用程序上下文

来自分类Dev

应用程序上下文被加载两次-Spring Boot

来自分类Dev

Spring JUnit Test未加载完整的应用程序上下文

来自分类Dev

Spring MVC在应用程序上下文中刷新数据库bean

来自分类Dev

Spring Boot sperate @Configurations用于多个应用程序上下文

来自分类Dev

如何在Spring Framework 4中初始化应用程序上下文

来自分类Dev

如何在Spring 2.5中从字符串加载应用程序上下文?

来自分类Dev

Spring应用程序上下文重载不会更新DelegatingFilterProxy注册的Bean

来自分类Dev

Spring 4中的差异应用程序上下文

来自分类Dev

Spring MVC在应用程序上下文中刷新数据库Bean

来自分类Dev

Spring ContextConfiguraion无法加载应用程序上下文

来自分类Dev

如何在Spring的应用程序上下文中添加http会话管理标签?

来自分类Dev

在创建 Spring 应用程序上下文之前阅读 application.properties

来自分类Dev

在Spring应用程序上下文中配置c3p0(intSQL和时区)

来自分类Dev

Spring应用程序上下文-主文件夹和测试文件夹

来自分类Dev

两个spring应用程序都使用特定的jar和应用程序上下文-如何控制从上下文从哪个应用程序中获取bean?

来自分类Dev

Spring应用程序中的根上下文路径

来自分类Dev

如何从测试应用程序上下文中排除 Spring Boot 应用程序 bean?

Related 相关文章

  1. 1

    从Spring安全性上下文访问应用程序上下文

  2. 2

    Spring递归加载应用程序上下文

  3. 3

    Spring应用程序上下文为null

  4. 4

    在单元测试中启动和关闭Spring应用程序上下文

  5. 5

    Spring应用程序-应用程序上下文IOC

  6. 6

    无法在 Spring Boot 应用程序中加载应用程序上下文

  7. 7

    Spring MVC Web应用程序中的根上下文和调度程序Servlet上下文到底是如何?

  8. 8

    重新加载或刷新测试方法中的Spring应用程序上下文?

  9. 9

    Spring 4中的差异应用程序上下文

  10. 10

    从应用程序上下文中删除Spring Bean

  11. 11

    多次导入同一spring应用程序上下文文件

  12. 12

    以编程方式将Bean添加到Spring应用程序上下文

  13. 13

    应用程序上下文被加载两次-Spring Boot

  14. 14

    Spring JUnit Test未加载完整的应用程序上下文

  15. 15

    Spring MVC在应用程序上下文中刷新数据库bean

  16. 16

    Spring Boot sperate @Configurations用于多个应用程序上下文

  17. 17

    如何在Spring Framework 4中初始化应用程序上下文

  18. 18

    如何在Spring 2.5中从字符串加载应用程序上下文?

  19. 19

    Spring应用程序上下文重载不会更新DelegatingFilterProxy注册的Bean

  20. 20

    Spring 4中的差异应用程序上下文

  21. 21

    Spring MVC在应用程序上下文中刷新数据库Bean

  22. 22

    Spring ContextConfiguraion无法加载应用程序上下文

  23. 23

    如何在Spring的应用程序上下文中添加http会话管理标签?

  24. 24

    在创建 Spring 应用程序上下文之前阅读 application.properties

  25. 25

    在Spring应用程序上下文中配置c3p0(intSQL和时区)

  26. 26

    Spring应用程序上下文-主文件夹和测试文件夹

  27. 27

    两个spring应用程序都使用特定的jar和应用程序上下文-如何控制从上下文从哪个应用程序中获取bean?

  28. 28

    Spring应用程序中的根上下文路径

  29. 29

    如何从测试应用程序上下文中排除 Spring Boot 应用程序 bean?

热门标签

归档