spring的监听器应用以及监听器里面注入bean(需调用service)

一、应用场景
需要程序启动后,不断地对一个接口访问
二、代码(xml版本)
web.xml

<!-- 自定义监听器  外呼接口回执 -->
    <listener>
        <listener-class>com.xxxx..listener.OutboundListener</listener-class>
    </listener>

自定义的监听器

public class OutboundListener extends Thread implements ServletContextListener{

	
	/**
	 * 服务启动执行
	 */
	@Override
	public void contextInitialized(ServletContextEvent arg0) {
        System.out.println("启动线程==========(执行外呼接口回执)==============");
        //服务器动,开启一个线程
        super.start();
	}
	
	/**
	 * 服务注销执行
	 */
	@Override
	public void contextDestroyed(ServletContextEvent sce) {
	
		//stop方法是不安全的, 停止线程会使它解锁它已锁定的所有监视器。
		super.interrupt();
      
	}

	
	@Override
	public void run() {
		ScpService scpService = ScpClientImpl.getInstance();
		while(true) {
        	//睡一会
        	try {
				Thread.sleep(10000);
				//业务代码
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
        }
	}

}

三、如果需要注入bean
此时ioc容器还没有初始化,无法从中依赖注入bean
启动方法中加

/**
	 * 服务启动执行
	 */
	@Override
	public void contextInitialized(ServletContextEvent arg0) {
		ServletContext application = arg0.getServletContext();
		WebApplicationContext appctx = WebApplicationContextUtils.getWebApplicationContext(application);
		this.guideToolService = appctx.getBean(GuideToolService.class);
		
		//服务器动,开启一个线程
        super.start();
	}

web.xml中也需要加入

<listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

不加appctx 是null。
原理:服务器在启动时会读取Web.xml中的配置的监听,而ContextLoaderListener这个监听类的职责就是自动封装WebApplicationContext对象,由于没有配置该监听所有获取到对象是null


版权声明:本文为qq_37752382原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。