博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
在Spring容器外调用bean
阅读量:7054 次
发布时间:2019-06-28

本文共 3246 字,大约阅读时间需要 10 分钟。

这个东西源于这种需求:一个应用丢到服务其后,不管用户有没有访问项目,这个后台线程都必须给我跑,而且这个线程还调用了Spring注入的bean,这样自然就会想到去监听Servlet的状态,当Servlet初始化完毕后会调用ServletContextListener中的contextInitialized方法,所以可以创建一个继承ServletContextListener类来监听Servlet的状态,在contextInitialized方法中来启动后台的线程,但是如何使用Spring注入的bean呢?所以必须确保在启动线程前Spring容器必须初始化完毕,Spring的初始化也是有Listener完成的,所以这里特别注意的是自定的监听器必须放在Spring的监听器之后(很重要),否则无法获取bean属性,会报空指针异常!

1.创建监听器

package com.hhu.listener;import javax.servlet.ServletContextEvent;import javax.servlet.ServletContextListener;import com.hhu.threads.DiagnosisThread;/** * 这个监听器在WEB容器初始化后就立刻启用了 * @author Weiguo Liu * @data 2017年11月30日 */public class ContextListener implements ServletContextListener  {    @Override    public void contextInitialized(ServletContextEvent sce) {        System.out.println("加载应用程序...");//      StationService stationService = WebApplicationContextUtils.getWebApplicationContext(sce.getServletContext()).getBean(StationService.class);//      System.out.println("stationService=" + stationService);        /*         * 创建诊断线程并启动         */        DiagnosisThread dt = new DiagnosisThread();        dt.start();        System.out.println("Listener继续执行");    }    @Override    public void contextDestroyed(ServletContextEvent sce) {        // TODO Auto-generated method stub    }}

 

 

2.web.xml配置启动顺序

contextConfigLocation
classpath:spring/spring-*.xml
org.springframework.web.context.ContextLoaderListener
com.hhu.listener.ContextListener
springDispatcherServlet
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath:spring/spring-*.xml
1
springDispatcherServlet
/

 

 

3.写一个获取Spring Bean的工具类

由于ServletContextListener并不被Spring管理,所以我们不能使用@Autowired注解来获取相应的bean属性,而是利用ApplicationContext来获取Bean,代码如下

package com.hhu.util;import org.springframework.beans.BeansException;import org.springframework.context.ApplicationContext;import org.springframework.context.ApplicationContextAware;/** * 使用getBean可以获取对应的bean,自己的的手动进行类型强转 * 创建获取SpringBean的工具类 * @author Weiguo Liu * */public class SpringBeanUtil implements ApplicationContextAware {    private static ApplicationContext applicationContext = null;    @Override    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {        SpringBeanUtil.applicationContext = applicationContext;    }    public static Object getBeanByName(String beanName) {        if (applicationContext == null) {            return null;        }        return applicationContext.getBean(beanName);    }    public static 
T getBean(Class
type) { return applicationContext.getBean(type); }}

 

 

这样以后就可以在后台线程中愉快的获取Spring bean了,这个工具类很强大,只要Spring初始化后,不管所在类是否被Spring管理,都可以使用如下的方式获取

bean的类型 bean的名字 = (bean的类型)SpringBeanUtil.getBeanByName("bean的名字");

 

做的越多,也就发现自己不懂的越多,还是要深入理解其原理啊

转载于:https://www.cnblogs.com/weixupeng/p/10459583.html

你可能感兴趣的文章
填报脚本之轻松搞定复杂表的数据入库
查看>>
HttpClient在多线程环境下踩坑总结
查看>>
接入高防后为什么有一些网站,APP等会出现延迟,打开速度慢等问题? ...
查看>>
Vue-cli3 简qian易yi教程
查看>>
Linux服务器---DansGuardian
查看>>
Intel处理器供应紧张最晚4季度缓解,俄勒冈州新工厂6月底前开建 ...
查看>>
Confluence 6 计划你的升级
查看>>
网站常见问题1分钟定位 - 如何使用阿里云ARMS轻松重现用户浏览器问题 ...
查看>>
【机器学习PAI实战】—— 玩转人工智能之综述
查看>>
基于HBase和Spark构建企业级数据处理平台
查看>>
MyBatis的配置方式
查看>>
5分钟,关于Python 解包,你需要知道的一切
查看>>
实验吧--隐写术
查看>>
NLP领域中更有效的迁移学习方法
查看>>
【全面解禁!真正的Expression Blend实战开发技巧】第六章 认识ListBox
查看>>
蜗牛爬行日记——记Python语法基础与C语言的异同(二)
查看>>
云栖大会首设“科技脱贫”专场 ,20张会场门票等你来拿!
查看>>
Redis字符串类型内部编码剖析
查看>>
TensorFlow实战(一)-人工智能基础知识
查看>>
Mysql数据库学习笔记
查看>>