为什么Spring MVC需要至少两个上下文?

12 浏览
0 Comments

为什么Spring MVC需要至少两个上下文?

在Spring MVC中,有两个上下文。一个是应用程序上下文或全局上下文,由ContextLoaderListener启动。它接收contextConfigLocation参数中提到的所有配置文件。

现在,如果您也使用Spring MVC,那么需要Dispatcher servlet,它会启动另一个容器,也被称为Web应用容器。这个容器将全局容器作为父容器。

当将struts1与spring集成时,只有一个上下文。为什么Spring MVC需要两个上下文?在使用Spring MVC时是否可能只使用一个上下文?

谢谢!

0
0 Comments

Spring MVC需要至少两个上下文的原因是因为DispatcherServlet创建了自己的上下文,并将其连接到父上下文中。如果只有一个上下文,那么DispatcherServlet将无法独立配置和管理其自身的依赖关系。因此,需要至少两个上下文来分别配置和管理DispatcherServlet的依赖和全局配置。

为了解决这个问题,可以使用两个独立的上下文来配置和管理DispatcherServlet的依赖和全局配置。一个上下文用于配置和管理DispatcherServlet的特定依赖和配置,另一个上下文用于配置和管理全局共享的依赖和配置。这样,可以实现DispatcherServlet的独立配置和管理,并且还可以共享全局配置。

下面是一些示例代码,演示了如何使用两个上下文来配置和管理DispatcherServlet的依赖和全局配置:

// 创建DispatcherServlet实例
DispatcherServlet dispatcherServlet = new DispatcherServlet();
// 创建DispatcherServlet的特定上下文
XmlWebApplicationContext servletContext = new XmlWebApplicationContext();
servletContext.setConfigLocation("/WEB-INF/dispatcher-servlet.xml");
// 创建全局共享的上下文
XmlWebApplicationContext globalContext = new XmlWebApplicationContext();
globalContext.setConfigLocation("/WEB-INF/global-context.xml");
// 设置DispatcherServlet的上下文
dispatcherServlet.setContexts(new ApplicationContext[]{servletContext, globalContext});
// 配置并启动DispatcherServlet
ServletRegistration.Dynamic registration = servletContext.addServlet("dispatcherServlet", dispatcherServlet);
registration.setLoadOnStartup(1);
registration.addMapping("/");

通过这种方式,我们可以使用两个独立的上下文来配置和管理DispatcherServlet的依赖和全局配置,从而实现了Spring MVC需要至少两个上下文的要求。

0
0 Comments

为什么Spring MVC至少需要两个上下文?

在Spring MVC中,至少需要两个上下文的原因是为了实现灵活的应用程序配置和管理。根应用程序上下文和子servlet上下文的结合可以提供更好的模块化和可重用性。

根应用程序上下文是整个Web应用程序的主要上下文,它包含了整个应用程序的全局性配置和共享的bean定义。它可以由web.xml文件中的ContextLoaderListener加载,并可以包含一些全局性的配置文件,如数据库连接和事务管理等。

子servlet上下文是每个servlet的独立上下文,它包含了与该servlet相关的特定配置和bean定义。每个servlet都有自己的上下文,可以通过在web.xml文件中配置DispatcherServlet来加载。子servlet上下文可以继承根应用程序上下文中的bean定义,同时也可以定义自己特有的bean。

这种根应用程序上下文和子servlet上下文的结合可以实现以下好处:

1. 模块化:根应用程序上下文包含了整个应用程序的共享配置和bean定义,可以在不同的servlet上下文中共享使用。这样可以减少重复配置,并且更方便地管理和维护应用程序的配置。

2. 可重用性:根应用程序上下文中定义的bean可以在不同的servlet上下文中重用。这样可以避免重复定义相同的bean,并且可以提高应用程序的可重用性和灵活性。

解决方法是如果您知道您的应用程序不会有第二个servlet,那么可以只使用一个单独的Spring上下文来管理整个Web应用程序。只需要在web.xml文件中删除ContextLoaderListener和相应的contextConfigLocation上下文参数,并将所有的bean定义移动到定义servlet上下文的xml文件中([servlet-name]-servlet.xml)。

这是可能的,因为FrameworkServletDispatcherServlet的父类)在创建servlet上下文时并不关心其是否存在根应用程序上下文。它只是将根上下文作为父上下文传递,如果可用的话。相关代码可以在这里找到。

0
0 Comments

为什么Spring MVC至少需要两个上下文?

在Spring MVC中,通常至少需要两个上下文,即应用程序上下文(Application Context)和Web应用程序上下文(WebApplicationContext)。这是因为Spring MVC需要将应用程序的业务逻辑和Web层的逻辑分离开来,以实现更好的代码重用和可维护性。

为了实现代码重用,将服务(services)隔离在应用程序上下文中比WebApplicationContext中更好。然而,这并不是强制性的,你也可以只使用WebApplicationContext。

上述问题的解决方法可以参考Stack Overflow上的回答。具体解决方法可以参考以下代码:

@Configuration
public class RootConfig {
    // 配置应用程序上下文中的服务
}
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
    // 配置WebApplicationContext中的逻辑
}
public class MyWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
    @Override
    protected Class[] getRootConfigClasses() {
        return new Class[] { RootConfig.class };
    }
    @Override
    protected Class[] getServletConfigClasses() {
        return new Class[] { WebConfig.class };
    }
    @Override
    protected String[] getServletMappings() {
        return new String[] { "/" };
    }
}

通过以上配置,我们可以将服务隔离在应用程序上下文中,将Web层的逻辑放在WebApplicationContext中,从而实现代码的重用和可维护性。这种分离的设计可以帮助我们更好地组织和管理代码,提高开发效率和代码质量。

0