ContextLoaderListener
1.定义 继承于 ContextLoader 实现 ServletContextListener
public class ContextLoaderListener extends ContextLoader implements ServletContextListener {
public ContextLoaderListener() {
}
public ContextLoaderListener(WebApplicationContext context) {
super(context);
}
public void contextInitialized(ServletContextEvent event) {
this.initWebApplicationContext(event.getServletContext());
}
public void contextDestroyed(ServletContextEvent event) {
this.closeWebApplicationContext(event.getServletContext());
ContextCleanupListener.cleanupAttributes(event.getServletContext());
}
}
2.作用: 将Web容器与spring容器整合
RequestContextListener
1.定义
public class RequestContextListener implements ServletRequestListener {
private static final String REQUEST_ATTRIBUTES_ATTRIBUTE = RequestContextListener.class.getName() + ".REQUEST_ATTRIBUTES";
public RequestContextListener() {
}
public void requestInitialized(ServletRequestEvent requestEvent) {
if (!(requestEvent.getServletRequest() instanceof HttpServletRequest)) {
throw new IllegalArgumentException("Request is not an HttpServletRequest: " + requestEvent.getServletRequest());
} else {
HttpServletRequest request = (HttpServletRequest)requestEvent.getServletRequest();
ServletRequestAttributes attributes = new ServletRequestAttributes(request);
request.setAttribute(REQUEST_ATTRIBUTES_ATTRIBUTE, attributes);
LocaleContextHolder.setLocale(request.getLocale());
RequestContextHolder.setRequestAttributes(attributes);
}
}
public void requestDestroyed(ServletRequestEvent requestEvent) {
ServletRequestAttributes attributes = null;
Object reqAttr = requestEvent.getServletRequest().getAttribute(REQUEST_ATTRIBUTES_ATTRIBUTE);
if (reqAttr instanceof ServletRequestAttributes) {
attributes = (ServletRequestAttributes)reqAttr;
}
RequestAttributes threadAttributes = RequestContextHolder.getRequestAttributes();
if (threadAttributes != null) {
LocaleContextHolder.resetLocaleContext();
RequestContextHolder.resetRequestAttributes();
if (attributes == null && threadAttributes instanceof ServletRequestAttributes) {
attributes = (ServletRequestAttributes)threadAttributes;
}
}
if (attributes != null) {
attributes.requestCompleted();
}
}
}
2.作用: 将Spring容器与Web容器结合的更加密切
3.在web.xml中需要配置
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
4.spring配置文件声明: 多个配置文件可以用 ","分隔
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
ServletContextListener
1.定义 集成于 ExentListener
public interface ServletContextListener extends EventListener {
void contextInitialized(ServletContextEvent var1);
void contextDestroyed(ServletContextEvent var1);
}
2..作用: 只负责监听web容器的启动和关闭的事件
Spring IOC容器实例化bean的作用域:
1.spring2.0后可以使用 sope="作用域类型"来指定作用域
2.作用域类型
- singleton 单例: 在spring IOC容器中仅存在一个Bean实例,Bean以单实例的方式存在.
- prototype 多例: 每次从容器中调用Bean时,都返回一个新的实例,即每次调用getBean()时,相当于执行new XxxBean()的操作.
- request 每次http请求都会创建一个新的bean
- 该作用域仅适用于webApplicationContext环境
- session 同一个http session共享一个bean
- 不同HTTP session使用不同的Bean,该作用域仅适用于webApplicationContext环境。
- globalSession 同一个全局session共享一个bean
- 一般用于portlet应用环境,该作用域仅适用于webApplicationContext环境。
3.示例: 默认即是singleton
<bean id="car" class="com.baobaotao.scope.Car" scope="singleton"/>
4.设置lazy-init属性
- 作用: 在默认情况下,spring的ApplicationContext容器在启动时,自动实例化所有singleton的Bean并缓存于容器中。虽然启动时会花费一些时间,但带来两个好处:首先对Bean提前的实例化操作会及早发现一些潜在的配置问题。其次Bean以缓存的方式保存,当运行时使用到该Bean时就无须再实例化了,加快了运行效率
- 示例:
<bean id="bean1" class="com.demo.scope.Student" lazy-init="true"></bean>
为何在bean中需要request,session或者globalsession的支持的时候需要配置RequestContextListener
1.说明
在整合spring容器时使用ContextLoaderListener,它实现了ServletContextListener监听器接口,
注意: ServletContextListener只负责监听web容器启动和关闭的事件
而RequestContextListener实现ServletRequestListener监听器接口,
注意: 该监听器监听HTTP请求事件,web服务器接收的每一次请求都会通知该监听器
2.所以
spring容器启动和关闭操作由web容器的启动和关闭事件触发,但如果spring容器中的Bean需要request,session,globalsession作用域的支持,spring容器本身就必须获得web容器的HTTP请求事件,以HTTP请求的事件”驱动”Bean作用域的控制逻辑