《看透SpringMVC》第九章 SpringMVC之器

9 springmvc 之器

9.1 整体结构介绍

EnvironmentCapable、EnvironmentAware

分别getEnv()提供(给spring调用)、setEnv()获取Environment

这里输入引用文本这里输入引用文本

Environment的实现类之一StandardServletEnvironment 主要保存有

- ServletConfig
- ServletContext
- JNDI
- 虚拟机属性(java版本、操作系统、临时目录等)
- 系统环境变量(JAVA_HOME、PATH)

MutablePropertySources 保存 Environment 使用 CopyOnWriteArrayList 容器(https://www.cnblogs.com/dolphin0520/p/3938914.html),读写分离思想,也是多线程整块替换思想

ApplicationContextAware

setApplicationContext(ApplicationContext) 设置context

9.2 HttpServletBean

【设置ServletConfig】使用BeanWrapper 设置servletConfigProperty到 this(DispatcherServlet)

将Servlet初始化参数设置到该组件上 //如contextAttribute、contextClass、namespace、contextConfigLocation;

为什么使用BeanWrapper呢?

不能使用set方法么?

9.3 FrameworkServlet

	<!-- MVC Servlet -->
	<servlet>
		<servlet-name>springServlet</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>classpath*:/spring-mvc*.xml</param-value>
		</init-param>

        <!--
        是否将webApplicationContext设置到ServletContext
        <init-param>
            <param-name>publishContext</param-name>
            <param-value>false</param-value>
        </init-param>

        ServletContext 中要用作WebApplicationContext的属性名称。
        <init-param>
            <param-name>contextAttribute</param-name>
            <param-value>xxx</param-value>
        </init-param>

        当DispatcherServlet处理完一个请求后,是否需要向容器发布一个ServletRequestHandledEvent事件,默认为ture
        <init-param>
            <param-name>publishEvents</param-name>
            <param-value>false</param-value>
        </init-param>
        -->

		<load-on-startup>1</load-on-startup>
	</servlet>
	<servlet-mapping>
		<servlet-name>springServlet</servlet-name>
		<url-pattern>/</url-pattern>
	</servlet-mapping>

初始化WebApplicationContext

  • HttpServletBean进行了设置ServletConfig,Framework使用设置的参数进行初始化。
  • 将WebApplicationContext设置到ServletContext中。【publishContext配置】
  • 模版方法onRefresh()
  • 添加ContextRefreshListener()(FrameworkServlet内部监听器),收到ContextRefreshedEvent后调用onRefresh()

9.4 DispatcherServlet

  • onRefresh() -> initStrategies() 初始化各个组件

    初始化组件方法:从context中找相应的组件,找不到则使用默认组件(定义在DispatcherServlet.properties中)。

猜你喜欢

转载自my.oschina.net/u/1245414/blog/1580652
今日推荐