为何实现ServletContextAware接口就可以获得servletContext
今天看某个项目,发现他实现了ServletContextAware接口,然后就可以直接获得了servletContext
最后简单的查看了下源码,发现他的运行方式时这样的
首先时springmvc容器启动时
他会对XmlWebApplicationContext的实例化及对其属性的设置
而XmlWebApplicationContext,其中的部分不代码如下
public class XmlWebApplicationContext extends AbstractRefreshableWebApplicationContext { /** Default config location for the root context */ public static final String DEFAULT_CONFIG_LOCATION = "/WEB-INF/applicationContext.xml"; /** Default prefix for building a config location for a namespace */ public static final String DEFAULT_CONFIG_LOCATION_PREFIX = "/WEB-INF/"; /** Default suffix for building a config location for a namespace */ public static final String DEFAULT_CONFIG_LOCATION_SUFFIX = ".xml";这些信息是不是很熟悉,是不是我们更加认为springmvc启动时就会加载他。
当然他还继承了AbstractRefreshableWebApplicationContext这个抽象类
在这个抽象类里面他实现了很多接口,其中也实现了 ConfigurableWebApplicationContext这个接口
ConfigurableWebApplicationContext这个接口他又继承了很多接口,这里为就不写了
总之在这很多的接口之中,有一个继承了ServletContextAware接口
所以我们主要看看AbstractRefreshableWebApplicationContext这个抽象类中的方法
public abstract class AbstractRefreshableWebApplicationContext extends AbstractRefreshableConfigApplicationContext implements ConfigurableWebApplicationContext, ThemeSource { /** Servlet context that this context runs in */ private ServletContext servletContext; /** Servlet config that this context runs in, if any */ private ServletConfig servletConfig; /** Namespace of this context, or {@code null} if root */ private String namespace; /** the ThemeSource for this ApplicationContext */ private ThemeSource themeSource; public AbstractRefreshableWebApplicationContext() { setDisplayName("Root WebApplicationContext"); } @Override public void setServletContext(ServletContext servletContext) { this.servletContext = servletContext; }这个抽象类中有被实现的方法 setServletContext方法,这个方法就获得了ServletContext
我们只需要ServletContextAware,就可以获得ServletContext上下文
爆款云服务器s6 2核4G 低至0.46/天,具体规则查看活动详情