Spring来一发(一)Spring容器

1、容器启动

Spring提供了构建Web应用程序的组件Spring MVC,通过Spring MVC和Spring Core就可以搭建一个稳定的JavaWeb项目。以下介绍Spring容器的启动过程。

Tomcat服务器启动入口文件是web.xml,通过在其中配置相关的Listener和Servlet即可加载Spring MVC所需数据。

<!-- 加载Spring配置文件 --> 
  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>


<!-- 加载spring mvc --> 
  <servlet>
    <servlet-name>mvc-dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>

  <servlet-mapping>
    <servlet-name>mvc-dispatcher</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>

 ContextLoaderListener基于Web上下文级别的监听器在启动服务器时就创建ApplicationContext并且将配置的Spring Bean加载到容器中。

DispatcherServlet是一个请求分发控制器,所有匹配的URL都会通过该Servlet分发执行,在创建Servlet对象时会初始化Spring MVC相关配置。

二、ContextLoaderListener

web容器提供了一个全局的上下文环境ServletContext,为后面Spring容器提供宿主环境,在web容器启动时会触发容器初始化事件,ContextLoaderListener监听到这个事件后其contextInitialized方法就会被调用,在这个方法中,spring会初始化一个根上下文,也就是WebApplicationContext,实际实现类一般是XmlWebApplicationContext,这个其实就是spring的IoC容器,Spring会将它存储到ServletContext,可供后面获取到该容器中的bean。

public class ContextLoaderListener extends ContextLoader implements ServletContextListener {
    public ContextLoaderListener() {
    }

    public ContextLoaderListener(WebApplicationContext context) {
        super(context);
    }

    public void contextInitialized(ServletContextEvent event) {
        this.initWebApplicationContext(event.getServletContext());
    }

    public void contextDestroyed(ServletContextEvent event) {
        this.closeWebApplicationContext(event.getServletContext());
        ContextCleanupListener.cleanupAttributes(event.getServletContext());
    }
}

ContextLoaderListener源码如上,一个构造方法,一个初始化方法contextInitialized,和一个销毁方法contextDestroyed。initWebApplicationContext方法做了三件事:创建WebApplicationContext;加载对应的Spring文件创建里面的Bean实例;将WebApplicationContext放入ServletContext(就是Java Web的全局变量)中。

三、DispatcherServlet

在contextLoaderListener监听器初始化完毕后,开始初始化web.xml中配置的Servlet,这个servlet可以配置多个,以DispatcherServlet为例,这个servlet实际上是一个标准的前端控制器,用以转发、处理每个servlet请求。DispatcherServlet在初始化的时候会建立自己的IoC上下文,用以持有Spring MVC相关的Bean。在建立DispatcherServlet自己的IoC上下文时,会先从ServletContext中获取根上下文WebApplicationContext作为自己的parent上下文。

DispatcherServlet的上下文仅仅是Spring MVC的上下文, 而ContextLoaderListener的上下文则对整个Spring都有效。ContextLoaderListener中创建ApplicationContext主要用于整个Web应用程序需要共享的一些组件,比如DAO的ConnectionFactory等。而由DispatcherServlet创建的ApplicationContext主要用于和该Servlet相关的一些组件,比如Controller、ViewResovler等。

 

参考资料:

https://www.cnblogs.com/rgky/p/5912320.html

https://www.cnblogs.com/weknow619/p/6341395.html

猜你喜欢

转载自blog.csdn.net/ss1300460973/article/details/85680992