回覆列表
  • 1 # 悸動回憶

    在Spring中,凡是實現ServletContextAware介面的類,都可以取得ServletContext.

    實現如下:

    Java程式碼

    private ServletContext application;

    public void setServletContext(ServletContext servletContext) {

    this.application = servletContext;

    }

    那麼Spring是在什麼時候把ServletContext放置進去的呢。

    透過對Spring的學習,終於明白了。

    在web專案中,Spring容器的載入是透過XmlWebApplicationContext進行的。

    它的父類AbstractRefreshableWebApplicationContext,在postProcessBeanFactory方法中進行了如下操作(postProcessBeanFactory方法被AbstractApplicationContext的refresh方法呼叫)

    Java程式碼

    beanFactory.addBeanPostProcessor(new ServletContextAwareProcessor(this.servletContext, this.servletConfig));

    beanFactory.ignoreDependencyInterface(ServletContextAware.class);

    beanFactory.ignoreDependencyInterface(ServletConfigAware.class);

    WebApplicationContextUtils.registerWebApplicationScopes(beanFactory, this.servletContext);

    WebApplicationContextUtils.registerEnvironmentBeans(beanFactory, this.servletContext, this.servletConfig);

    程式碼的第一句就是添加了一個ServletContextAwareProcessor。

    該類的postProcessBeforeInitialization方法如下:

    Java程式碼

    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {

    if (this.servletContext != null && bean instanceof ServletContextAware) {

    ((ServletContextAware) bean).setServletContext(this.servletContext);

    }

    if (this.servletConfig != null && bean instanceof ServletConfigAware) {

    ((ServletConfigAware) bean).setServletConfig(this.servletConfig);

    }

    return bean;

    }

    而所有的BeanPostProcessor都將在AbstractAutowireCapableBeanFactory類的initializeBean方法中,透過呼叫applyBeanPostProcessorsBeforeInitialization方法完成所有實現BeanPostProcessor介面的postProcessBeforeInitialization的呼叫。

    XmlWebApplicationContext使用的BeanFactory是DefaultListableBeanFactory。

    DefaultListableBeanFactory繼承了AbstractAutowireCapableBeanFactory,因此可以完成上述操作。

    如此完成了只要實現了ServletContextAware介面的,都可以獲取ServletContext

  • 中秋節和大豐收的關聯?
  • 想讓人重拾信心的詩句?