WebApplicationContext
阅读原文时间:2023年07月08日阅读:1

在Web应用中,我们会用到WebApplicationContext  用它来保存上下文信息

那么它set到ServletContext的过程是怎么样呢

1)通过WEB.XML中监听类

p.p1 { margin: 0; font: 11px Monaco }
span.s1 { color: rgba(0, 145, 147, 1) }
span.s2 { color: rgba(78, 145, 146, 1) }

org.springframework.web.context.ContextLoaderListener

p.p1 { margin: 0; font: 11px Monaco }

触发contextInitialized方法

再来看

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

public WebApplicationContext initWebApplicationContext(ServletContext servletContext) {

if (servletContext.getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE) != null``) {

throw new IllegalStateException(

"Cannot initialize context because there is already a root application context present - " +

"check whether you have multiple ContextLoader* definitions in your web.xml!"``);

}

Log logger = LogFactory.getLog(ContextLoader.``class``);

servletContext.log(``"Initializing Spring root WebApplicationContext"``);

if (logger.isInfoEnabled()) {

logger.info(``"Root WebApplicationContext: initialization started"``);

}

long startTime = System.currentTimeMillis();

try {

// Store context in local instance variable, to guarantee that

// it is available on ServletContext shutdown.

if (``this``.context == null``) {

this``.context = createWebApplicationContext(servletContext);

}

最后一行,又调用了createWebApplicationContext方法,我们再来看一下这个方法的代码:

1

2

3

4

5

6

7

8

protected WebApplicationContext createWebApplicationContext(ServletContext sc) {

Class<?>&nbsp;contextClass&nbsp;=&nbsp;determineContextClass(sc);

if (!ConfigurableWebApplicationContext.``class``.isAssignableFrom(contextClass))&nbsp;{

throw new ApplicationContextException(``"Custom&nbsp;context&nbsp;class&nbsp;[" +&nbsp;contextClass.getName()&nbsp;+

"]&nbsp;is&nbsp;not&nbsp;of&nbsp;type&nbsp;[" +&nbsp;ConfigurableWebApplicationContext.``class``.getName()&nbsp;+ "]"``);

}

return (ConfigurableWebApplicationContext)&nbsp;BeanUtils.instantiateClass(contextClass);

}

通过代码可知,在这里返回了一个ConfigurableWebApplicationContext,再来看一下contextLoader的initWebApplicationContext方法中最关键的代码:

1

servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, this``.context);

在这里把context存入servletContext中,所以以后要用到WebApplicationContext的时候可以从servletContext取出。