`

Web容器启动后执行代码的几种方式

 
阅读更多

1.实现Servlet监听器接口ServletContextListener

package com.yli.init;

import java.util.List;
import java.util.Map;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

import org.springframework.web.context.WebApplicationContext;

import com.suning.teach.service.ShopService;

public class InitListener implements ServletContextListener {

    @Override
    public void contextDestroyed(ServletContextEvent context) {
        // 上下文销毁之后执行
    }

    @Override
    public void contextInitialized(ServletContextEvent context) {
        // 上下文初始化执行
        System.out.println("================>[ServletContextListener]自动加载启动开始.");
        // 读取Spring容器中的Bean[此时Bean已加载,可以使用]
        WebApplicationContext wac = WebContextUtil.getContext();
        if (wac != null) {
            ShopService shopService = wac.getBean("shopService", ShopService.class);
            System.out.println("================>shopService[" + shopService + "]");
            List<Map<String, Object>> shopList = shopService.findAllShop();
            System.out.println("================>" + shopList);
        }
        System.out.println("================>[ServletContextListener]自动加载启动结束.");
    }

}

 

然后在web.xml文件配置该监听器

 

	<listener>
		<listener-class>com.yli.init.InitListener</listener-class>
	</listener>

 

 

注意:从Spring IOC容器中读取Bean的工具类WebContextUtil

package com.yli.init;

import org.springframework.web.context.ContextLoader;
import org.springframework.web.context.WebApplicationContext;

public class WebContextUtil {
    
    private static WebApplicationContext wac;

    public static WebApplicationContext getContext(){
        if(null == wac){
            wac = ContextLoader.getCurrentWebApplicationContext();
        }
        return wac;
    }
}

 

2.实现Servlet的过滤器Filter

package com.yli.init;

import java.io.IOException;
import java.util.List;
import java.util.Map;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

import org.springframework.web.context.WebApplicationContext;

import com.suning.teach.service.ShopService;

public class InitFilter implements Filter {

    @Override
    public void destroy() {

    }

    @Override
    public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2) throws IOException,
            ServletException {

    }

    @Override
    public void init(FilterConfig config) throws ServletException {
        System.out.println("================>[Filter]自动加载启动开始.");
        // 读取Spring容器中的Bean[此时Bean已加载,可以使用]
        WebApplicationContext wac = WebContextUtil.getContext();
        if (wac != null) {
            ShopService shopService = wac.getBean("shopService", ShopService.class);
            System.out.println("================>shopService[" + shopService + "]");
            List<Map<String, Object>> shopList = shopService.findAllShop();
            System.out.println("================>" + shopList);
        }
        System.out.println("================>[Filter]自动加载启动结束.");
    }

}

 

然后在web.xml文件配置过滤器即可

	<filter>
		<filter-name>InitFilter</filter-name>
		<filter-class>com.yli.init.InitFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>InitFilter</filter-name>
		<url-pattern>/</url-pattern>
	</filter-mapping>

 

 

3.编写一个Servlet,在web.xml里面配置容器启动后执行即可

import java.util.List;
import java.util.Map;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;

import org.springframework.web.context.WebApplicationContext;

import com.suning.teach.service.ShopService;

public class InitServlet extends HttpServlet {

    /**
     */
    private static final long serialVersionUID = 1L;

    @Override
    public void init(ServletConfig config) {
        try {
            super.init();
        } catch (ServletException e) {
            e.printStackTrace();
        }
        System.out.println("================>[Servlet]自动加载启动开始.");
        // 读取Spring容器中的Bean[此时Bean已加载,可以使用]
        WebApplicationContext wac = WebContextUtil.getContext();
        if (wac != null) {
            ShopService shopService = wac.getBean("shopService", ShopService.class);
            System.out.println("================>shopService[" + shopService + "]");
            List<Map<String, Object>> shopList = shopService.findAllShop();
            System.out.println("================>" + shopList);
        }
        System.out.println("================>[Servlet]自动加载启动结束.");
    }
}

 

然后在web.xml文件配置该Servlet的启动方式为:容器启动后执行

	<servlet>
		<servlet-name>InitServlet</servlet-name>
		<servlet-class>com.yli.init.InitServlet</servlet-class>
		<init-param>
			<param-name>username</param-name>
			<param-value>yli</param-value>
		</init-param>
                <!-- 此处指定加载顺序为2,表明还有优先级更高的Servlet要先执行 -->
		<load-on-startup>2</load-on-startup>
	</servlet>
	<servlet-mapping>
		<servlet-name>InitServlet</servlet-name>
		<url-pattern>/</url-pattern>
	</servlet-mapping>

 关于启动后执行,由load-on-startup指定:

(1)当值为0或者大于0时,表示容器在应用启动时就加载这个servlet。值越小,启动优先级越高;

(2)当是一个负数时或者没有指定时,表示该servlet被调用时才加载。

 

4.如果你使用Spring IOC作为Bean管理容器,那么可以指定init-method

其中init-method表示bean加载成功后,立即执行某个方法。配置如下:start为要执行的方法名称

<!-- service -->
<bean id="shopService" class="com.yli.teach.service.ShopService" init-method="start">
	<property name="shopDao" ref="shopDao" />
</bean>
	
<!-- dao -->
<bean id="shopDao" class="com.yli.teach.dao.ShopDao">
	<property name="jdbcTemplate" ref="jdbcTemplate" />
</bean>

 

Java代码如下

package com.yli.teach.service;

import java.util.List;
import java.util.Map;

import com.yli.teach.dao.ShopDao;

public class ShopService{

    private ShopDao shopDao;

    // set 注入
    public void setShopDao(ShopDao shopDao) {
        this.shopDao = shopDao;
    }
    
    /**
     * 
     * 〈容器启动后执行方法〉
     */
    public void start(){
        System.out.println("================>[init-method]自动加载启动开始.");
        List<Map<String, Object>> shopList = shopDao.findAllShop();
        System.out.println("================>" + shopList);
        System.out.println("================>[init-method]自动加载启动结束.");
    }
} 

 

5.如果你使用Spring IOC作为Bean管理容器,还可以实现Spring的Bean后置处理器接口:BeanFactoryPostProcessor

表示:该Bean加载完成之后,Spring可以让开发者自定义一些事件,Java代码如下

package com.yli.init;

import java.util.List;
import java.util.Map;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;

import com.suning.teach.service.ShopService;

public class KeyWordInit implements BeanFactoryPostProcessor {

    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory factory) throws BeansException {
        System.out.println("================>[BeanFactoryPostProcessor]自动加载启动开始.");
        ShopService shopService = factory.getBean("shopService", ShopService.class);
        List<Map<String, Object>> shopList = shopService.findAllShop();
        System.out.println("================>" + shopList);
        System.out.println("================>[BeanFactoryPostProcessor]自动加载启动结束.");
    }

}

 

这个Bean在xml文件做正常配置即可,如下

<bean id="keyWordInit" class="com.yli.init.KeyWordInit">
</bean>

 

=================关于以上5种方式代码执行顺序的说明===================

4===>5===>1===>2===>3

即指定init-method的Bean开始执行

接着实现Spring的Bean后置处理器最先开始执行

然后是Servlet的监听器执行

再接下来是Servlet的过滤器执行

最后才是Servlet执行

 

分享到:
评论

相关推荐

    ssh(structs,spring,hibernate)框架中的上传下载

    Spring针对几个著名的Web服务器的数据源提供了相应的JDBC抽取器:  •WebLogic:WebLogicNativeJdbcExtractor  •WebSphere:WebSphereNativeJdbcExtractor  •JBoss:JBossNativeJdbcExtractor  在定义了JDBC...

    JAVA上百实例源码以及开源项目源代码

    你好,我是李四” 产生张三的密钥对(keyPairZhang) 张三生成公钥(publicKeyZhang)并发送给李四,这里发送的是公钥的数组字节 通过网络或磁盘等方式,把公钥编码传送给李四,李四接收到张三编码后的公钥,将其解码,李四...

    工程硕士学位论文 基于Android+HTML5的移动Web项目高效开发探究

    Android 一种基于Linux的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由Google公司和开放手机联盟领导开发 IOS 由苹果公司开发的移动操作系统 Webkit 一个开源的浏览器引擎,在手机上的...

    vc++ 应用源码包_6

    如题,主要源码就几个,详细见代码。 MzfHips主动防御 主要在MzfHipsDlg中,程序分析进程数据、驱动数据、注册表数据从而实现主动防御。 超级下载 不过不是c++源码 Notepad++ V5.6.8 源码! OA精灵代码 c++版 ...

    vc++ 应用源码包_5

    如题,主要源码就几个,详细见代码。 MzfHips主动防御 主要在MzfHipsDlg中,程序分析进程数据、驱动数据、注册表数据从而实现主动防御。 超级下载 不过不是c++源码 Notepad++ V5.6.8 源码! OA精灵代码 c++版 ...

    java 面试题 总结

    Session Bean 还可以再细分为 Stateful Session Bean 与 Stateless Session Bean ,这两种的 Session Bean都可以将系统逻辑放在 method之中执行,不同的是 Stateful Session Bean 可以记录呼叫者的状态,因此通常来...

    JAVA上百实例源码以及开源项目

     通过网络或磁盘等方式,把公钥编码传送给李四,李四接收到张三编码后的公钥,将其解码,李四用张三的公钥加密信息,并发送给李四,张三用自己的私钥解密从李四处收到的信息…… Java利用DES私钥对称加密代码实例 ...

    超级有影响力霸气的Java面试题大全文档

     Session Bean 还可以再细分为 Stateful Session Bean 与 Stateless Session Bean ,这两种的 Session Bean都可以将系统逻辑放在 method之中执行,不同的是 Stateful Session Bean 可以记录呼叫者的状态,因此通常...

    java基础题 很全面

    解析XML文档有哪几种方式? 12 49. 你在项目中用到了xml技术的哪些方面?如何实现的? 12 50. 简述synchronized和java.util.concurrent.locks.Lock的异同 ? 13 51. 排序都有哪几种方法?请列举。用JAVA实现一个快速排序...

    千方百计笔试题大全

    70、多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么? 17 71、启动一个线程是用run()还是start()? 17 72、当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法? 18 73...

    java面试宝典

    70、多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么? 17 71、启动一个线程是用run()还是start()? 17 72、当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法? 18 73...

    javaSE代码实例

    1.2.3 安装后Java目录的解读 7 1.3 学会使用API 7 1.4 第一个Java程序 8 1.4.1 开发源代码 8 1.4.2 编译运行 9 1.5 小结 11 第2章 基本数据类型——构建Java 大厦的基础 12 2.1 源代码注释 12 ...

    java面试题

    解析XML文档有哪几种方式? 14 28. JSP和Servlet有哪些相同点和不同点,他们之间的联系是什么? 15 29. Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)...

    java高效学习之路-过来人经验

    下面简要介绍几种常用的App Server: 1、Tomcat Tomcat严格意义上并不是一个真正的App Server,它只是一个可以支持运行Serlvet/JSP的Web容器,不过Tomcat也扩展了一些App Server的功能,如JNDI,数据库连接池,...

    Java面试宝典2010版

    解析XML文档有哪几种方式? 七. 流行的框架与新技术 1、谈谈你对Struts的理解。 2、谈谈你对Hibernate的理解。 3、AOP的作用。 4、你对Spring的理解。 5、谈谈Struts中的Action servlet。 6、Struts优缺点 ...

    最新Java面试宝典pdf版

    解析XML文档有哪几种方式? 117 七. 流行的框架与新技术 117 1、谈谈你对Struts的理解。 117 2、谈谈你对Hibernate的理解。 118 3、AOP的作用。 118 4、你对Spring的理解。 118 5、谈谈Struts中的Action servlet。 ...

    Java面试笔试资料大全

    解析XML文档有哪几种方式? 117 七. 流行的框架与新技术 117 1、谈谈你对Struts的理解。 117 2、谈谈你对Hibernate的理解。 118 3、AOP的作用。 118 4、你对Spring的理解。 118 5、谈谈Struts中的Action servlet。 ...

    vc++ 应用源码包_1

    如题,主要源码就几个,详细见代码。 MzfHips主动防御 主要在MzfHipsDlg中,程序分析进程数据、驱动数据、注册表数据从而实现主动防御。 超级下载 不过不是c++源码 Notepad++ V5.6.8 源码! OA精灵代码 c++版 ...

Global site tag (gtag.js) - Google Analytics