web项目初始化操作
2016-02-27 18:19
330 查看
前言:现在java web一般会用到Spring容器,那么当我们需要在项目初始化,进行一系列操作时该怎么办?很常见的一种情况就是,项目启动时要进行数据库一系列的操作。
在讲解具体操作之前先补充一下基础知识:
①web容器初始化的步骤是
web.xml的初始化顺序:context-param –> listener –> filter –> servlet 。
②
当web.xml配置如上代码时则会启动Spring容器, ContextLoaderListener该类实现了ServletContextListener
③ ServletContextListener能够监听 ServletContext 对象的生命周期,实际上就是监听 Web 应用的生命周期。
当Servlet 容器启动或终止Web 应用时,会触发ServletContextEvent 事件,该事件由ServletContextListener 来处理。在 ServletContextListener 接口中定义了处理ServletContextEvent 事件的两个方法。
④当 Web 应用集成 Spring 容器后,代表 Spring 容器的WebApplicationContext对象将以
WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE 为键存放在ServletContext的属性列表中。您当然可以直接通过以下语句获取 WebApplicationContext:
WebApplicationContext wac = (WebApplicationContext)servletContext.
getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);
但通过位于 org.springframework.web.context.support 包中的WebApplicationContextUtils 工具类获取 WebApplicationContext 更方便:
WebApplicationContext wac =WebApplicationContextUtils.
getWebApplicationContext(servletContext);
那么若要在web启动的时候做一些操作,那么要怎么做?
1.方案 实现Spring BeanPostProcessor类
可以看出Spring在加载bean的时候都会回调postProcessAfterInitialization该方法,那么上图就是mybatis的SqlSessionTemplate实例化了后即可获取SqlSessionTemplate的实例进行一些数据库操作了。
2.继承 上面基础知识提到的ContextLoaderListener
3.继承ApplicationObjectSupport
未完,待续。
在讲解具体操作之前先补充一下基础知识:
①web容器初始化的步骤是
web.xml的初始化顺序:context-param –> listener –> filter –> servlet 。
②
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
当web.xml配置如上代码时则会启动Spring容器, ContextLoaderListener该类实现了ServletContextListener
③ ServletContextListener能够监听 ServletContext 对象的生命周期,实际上就是监听 Web 应用的生命周期。
当Servlet 容器启动或终止Web 应用时,会触发ServletContextEvent 事件,该事件由ServletContextListener 来处理。在 ServletContextListener 接口中定义了处理ServletContextEvent 事件的两个方法。
④当 Web 应用集成 Spring 容器后,代表 Spring 容器的WebApplicationContext对象将以
WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE 为键存放在ServletContext的属性列表中。您当然可以直接通过以下语句获取 WebApplicationContext:
WebApplicationContext wac = (WebApplicationContext)servletContext.
getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);
但通过位于 org.springframework.web.context.support 包中的WebApplicationContextUtils 工具类获取 WebApplicationContext 更方便:
WebApplicationContext wac =WebApplicationContextUtils.
getWebApplicationContext(servletContext);
那么若要在web启动的时候做一些操作,那么要怎么做?
1.方案 实现Spring BeanPostProcessor类
public class CacheBeanPostProcessor implements BeanPostProcessor{ DataCenters dataCenter = new DataCenters(); /* Bean实例化完毕后执行的后处理操作,所有初始化逻辑、装配逻辑之前执行, * 如果返回false将阻止其他的InstantiationAwareBeanPostProcessor的postProcessAfterInstantiation的执行, * (3.2和(9.1处执行;在此处可以执行一些初始化逻辑或依赖装配逻辑; * */ public Object postProcessAfterInitialization(Object obj, String arg1) throws BeansException { if(obj instanceof SqlSessionTemplate){ Firm.setSession((SqlSessionTemplate) obj); dataCenter.init(); } return obj; } public Object postProcessBeforeInitialization(Object arg0, String arg1) throws BeansException { return arg0; } }
可以看出Spring在加载bean的时候都会回调postProcessAfterInitialization该方法,那么上图就是mybatis的SqlSessionTemplate实例化了后即可获取SqlSessionTemplate的实例进行一些数据库操作了。
2.继承 上面基础知识提到的ContextLoaderListener
package com.ysb.framework.listener; import javax.servlet.ServletContextEvent; import org.springframework.context.ApplicationContext; import org.springframework.web.context.ContextLoaderListener; import org.springframework.web.context.support.WebApplicationContextUtils; public class BeanUtil extends ContextLoaderListener { private static ApplicationContext applicationContext; public void contextInitialized(ServletContextEvent event) { super.contextInitialized(event); //这里即可进行自己的初始化操作 applicationContext = WebApplicationContextUtils.getRequiredWebApplicationContext(event.getServletContext()); } public static Object getBean(String beanName) { return applicationContext.getBean(beanName); } } 将spring加载配置的监听重写一下,重写内容也很简单,继承一下ContextLoaderListener ,然后创建一个spring的静态容器,需要用到spring容器里的bean时就从静态容器里面取就行了。 web.xml中的spring的加载监听改为如下。 <listener> <listener-class> com.ysb.framework.listener.BeanUtil </listener-class> </listener> 楼主的加载方式是用的servlet,其实监听和servlet都是一样,目的就是在系统启动时执行那段加载代码。
3.继承ApplicationObjectSupport
import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ApplicationObjectSupport; public final class ToolSpring extends ApplicationObjectSupport { private static ApplicationContext applicationContext = null; @Override protected void initApplicationContext(ApplicationContext context) throws BeansException { super.initApplicationContext(context); //这里进行初始化操作 if (ToolSpring.applicationContext == null) { ToolSpring.applicationContext = context; } } public static ApplicationContext getAppContext() { return applicationContext; } public static Object getBean(String name) { return getAppContext().getBean(name); } }
未完,待续。
相关文章推荐
- corn表达式——用于设置定时任务
- Android中使用OrmLite(一):表创建及增删改查
- CodeForces 611 A. New Year and Days(水~)
- hibernate 搭建log4j日志环境
- Java设计模式--策略模式
- UVA 1600 Patrol Robot
- Android 实现形态各异的双向侧滑菜单 自定义控件来袭
- shell脚本实例-matrix
- 菜鸟在线教你用Unity3D开发VR版的Hello World
- ZOJ 2110 Tempter of the Bone (DFS)
- 企业后台模板
- java设计模式(四)--单例模式
- UVA 439 Knight Moves
- spring学习笔记 - 面试题
- 猴子吃桃子的问题
- FPGA知识大梳理(二)verilogHDL语法入门(1)
- CodeForces 612 D. The Union of k-Segments(水~)
- javascript高级程序设计笔记-第三章(基本概念)
- codeforces 628D 数位dp
- 绘画基础研究(一)-画面的对象组成与形状组成