Spring| Spring与Web整合

文章目录

  • 1.整合目的
  • 2.整合途径
  • 3.具体实现
  • 4.获取Spring容器


1.整合目的

将所有对象的创建与管理任务交给Spring容器,降低程序的耦合度。


2.整合途径

将Spring容器注入到Web容器中。


3.具体实现

使用ServletContextListener监听ServletContext,当ServletContexxt创建时同时创建Spring容器,并将创建完成的容器放到ServletContext即application中,在Web中获取Spring容器,就可以访问对象了。ContextLoadListener是ServletContextListener的一个实现类,精简配置如下:

<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListenerlistener-class>
listener>

默认情况下,Spring的配置文件只能放在WEB-INF目录下,而且名称为applicationContext.xml


如果需要自定义创建IOC容器的配置文件路径和名称可以通过找web.xml中配置上下文参数的方式实现,比如需要加载classpath下名称为spring-config.xml的配置文件做如下配置既可:

<context-param>
   <param-name>contextConfigLocationparam-name>
   <param-value>classpath:spring-config.xmlparam-value>
context>
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListenerlistener-class>
listener>

注意: 参数上下文参数名称固定为contextConfigLocation

实质在实例化web项目的时候,会触发监听器上下文ContextLoaderListener的初始化方法,我们看一下该监听器的实现

public class ContextLoaderListener extends ContextLoader implements ServletContextListener {

	public ContextLoaderListener() {
	}

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

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

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

web上下文初始化时,contextInitialized方法会被执行,也就是initWebApplicationContext方法将被执行接着我们看一下initWebApplicationContext的源码,发现程序为SpringIOC容器创建一个上下文,而且该上线文是WebApplicationContext,实际返回的是ConfigurableWebApplicationContext(继承自WebApplicationContext接口),所以this.context instanceof ConfigurableWebApplicationContext条件为true,但是生成可配置的上下文不是激活的(cwac.isActive()为false),因为isActive()在抽象类中的默认实现是返回属性active的值,active的值默认为false,该值需要调用prepareRefresh()后才变成true,所以接下来会执行configureAndRefreshWebApplicationContext(cwac, servletContext);在改方法中我们能看到给SpringIOC容器上下文设置配置文件的方式是从web的上下文获取上下文参数名称为contextConfigLocation的参数的值作为了Spring的配置文件.

Spring| Spring与Web整合_第1张图片

Spring| Spring与Web整合_第2张图片

Spring| Spring与Web整合_第3张图片


4.获取Spring容器

WebApplicationContext context=WebApplicationContextUtils.getRequiredWebApplicationContext(getServletContext());

你可能感兴趣的:(【Spring】)