由于项目需要,需在ServletContextListener监听接口实现类中调用spring注入的对象,以获取系统初始化参数.代码如下:

[java] view plain copy
  1. import java.io.IOException;
  2. import java.util.List;
  3. import javax.servlet.ServletContextEvent;
  4. import javax.servlet.ServletContextListener;
  5. import org.springframework.web.context.WebApplicationContext;
  6. import org.springframework.web.context.support.WebApplicationContextUtils;
  7. import pams.model.Device;
  8. import pams.service.Impl.DeviceManage;
  9. import pams.socket.TcpManager;
  10. import pams.socket.TcpServer;
  11. /**
  12. * 系统初始化
  13. * @author 恶灵骑士
  14. *
  15. */
  16. public class SysInitServlet implements ServletContextListener {
  17. //获取spring注入的bean对象
  18. private WebApplicationContext springContext;
  19. private DeviceManage deviceManager;
  20. //数据采集仪服务线程
  21. TcpServer daqServer = null;
  22. //继电器服务线程
  23. TcpServer realyServer = null;
  24. //Tcp连接管理器
  25. Thread tcpManager = null;
  26. public SysInitServlet(){
  27. super();
  28. }
  29. /**
  30. *应用程序退出时调用
  31. */
  32. @Override
  33. public void contextDestroyed(ServletContextEvent event) {
  34. serverDestroyed();
  35. System.out.println("应用程序关闭!");
  36. }
  37. /**
  38. * 应用程序加载时调用
  39. */
  40. @Override
  41. public void contextInitialized(ServletContextEvent event) {
  42. springContext = WebApplicationContextUtils.getWebApplicationContext(event.getServletContext());
  43. if(springContext != null){
  44. deviceManager = (DeviceManage)springContext.getBean("deviceManage");
  45. }else{
  46. System.out.println("获取应用程序上下文失败!");
  47. return;
  48. }
  49. System.out.println("初始化系统服务!");
  50. serverInitialized();
  51. System.out.println("TcpServer初始化完成!");
  52. }
  53. /**
  54. * 系统服务初始化
  55. * device_type:由于只需要知道采集仪,继电器端口号
  56. * 所以device_type设置为0
  57. */
  58. public void serverInitialized(){
  59. if(deviceManager == null){
  60. System.out.println("获取设备管理器失败!");
  61. return;
  62. }
  63. List<Device> devices = this.deviceManager.load(0);
  64. for(Device device : devices){
  65. System.out.println("设备ID-->"+device.getId());
  66. System.out.println("采集仪端口号-->"+device.getProperty1());
  67. System.out.println("继电器端口号-->"+device.getProperty2());
  68. System.out.println("所属大棚-->"+device.getShed().getName());
  69. }
  70. //开启串口服务器-数据采集仪监听线程
  71. TcpServer daqServer = new TcpServer(5678);
  72. TcpServer realyServer = new TcpServer(5679);
  73. tcpManager = new Thread(new TcpManager());
  74. if(daqServer.getServer() != null)
  75. {
  76. new Thread(daqServer).start();
  77. }
  78. if(realyServer.getServer()!=null){
  79. new Thread(realyServer).start();
  80. }
  81. tcpManager.start();
  82. }
  83. /**
  84. * 系统服务注销
  85. */
  86. @SuppressWarnings("deprecation")
  87. public void serverDestroyed(){
  88. if(daqServer!=null){
  89. try {
  90. daqServer.getServer().close();
  91. } catch (IOException e) {
  92. System.out.println("数据采集仪服务线程关闭出错 --> "+e.getMessage());
  93. }
  94. }
  95. if(realyServer!=null){
  96. try {
  97. realyServer.getServer().close();
  98. } catch (IOException e) {
  99. System.out.println("继电器服务线程关闭出错 --> "+e.getMessage());
  100. }
  101. }
  102. if(tcpManager!=null){
  103. tcpManager.stop();
  104. }
  105. }
  106. }

springContext为spring管理的应用程序上下文,里面存储spring管理的各种bean对象.deviceManager就是通过spring注入的设备控制业务层.

注意事项:

1.  由于实现的是ServletContextListener接口,故需要实现public void contextInitialized(ServletContextEvent event)方法和public void contextDestroyed(ServletContextEvent event)方法.前者在应用程序加载时调用,里面添加一些初始化业务.如初始化springContext,调用serverInitialized()完成系统服务初始化,后者用于应用程序关闭时调用,主要完成服务资源的注销.

既然是listener接口就要在web.xml中配置相关参数,如下:

<listener>
   <listener-class>pams.servlet.SysInitServlet</listener-class>
  </listener>

2.  由于需获取spring管理bean,故该listner配置需要放在spring监听器配置之后,以使spring完成初始化,如下:

[html] view plain copy
  1. <!--Spring ApplicationContext载入-->
  2. <listener>
  3. <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  4. </listener>
  5. <!-- Spring ApplicationContext配置文件的路径,此参数用于后面的Spring-Contextloader -->
  6. <context-param>
  7. <param-name>contextConfigLocation</param-name>
  8. <param-value>classpath:beans.xml</param-value>
  9. </context-param>
  10. lt;!-- 系统服务初始化 -->
  11. <listener>
  12. <listener-class>pams.servlet.SysInitServlet</listener-class>
  13. </listener>

如果想在外部类中调用通过这种方法得到的spring对象,可以把springContext设为static,然后提供相应的get方法,此处由于不需要故设为private..

在ServletContextListener实现类中获取spring注入对象相关推荐

  1. spring初始化在ServletContextListener实现类中获取spring注入对象

    查了好多资料,发现还是不全,干脆自己整理吧,至少保证在我的做法正确的,以免误导读者,也是给自己做个记录吧! 由于项目须要,需在ServletContextListener监听接口实现类中调用sprin ...

  2. 【SpringBoot】在普通类中获取spring容器中的bean

    这段时间公司搞封闭开发,做一个联通总部的客服系统项目,是基于springboot的.在开发工程中遇到一个页面datagrid数据排序的功能,因为有多个表的数据都要用到排序功能,于是我就写了一个排序功能 ...

  3. 在普通类中获取spring容器中的bean

    在普通类中获取spring容器中的bean 1.工具类 package com.itheima.hchat.util;import org.springframework.beans.BeansExc ...

  4. java 普通类request_[Java教程]spring在普通类中获取session和request

    [Java教程]spring在普通类中获取session和request 0 2014-08-12 08:01:13 在使用spring时,经常需要在普通类中获取session,request等对像. ...

  5. 170630、springboot编程之普通类中调用spring管理的bean对象

    我们知道如果我们要在一个类使用spring提供的bean对象,我们需要把这个类注入到spring容器中,交给spring容器进行管理,但是在实际当中,我们往往会碰到在一个普通的Java类中,想直接使用 ...

  6. java-在应用中获取spring定义的bean

    因为写了些bean作为quartz的任务用spring配置了,但有些时候需要在别的类中使用这些bean,没有太仔细去研究spring,依稀记得有个getBean,到网上g了一把,发现方法不止一种,选了 ...

  7. java 获取继承字段_java – 从类中获取所有字段(甚至是私有的和继承的)

    我在做大学项目. 我需要从类中获取所有字段.甚至私人和继承.我试图获取所有声明字段,然后投射到超类并重复. 我的代码片段: private void listAllFields(Object obj) ...

  8. 枚举类中获取枚举值的几种方法

    在开发的过程中我们经常会定义枚举类,枚举类中获取枚举值的方式也有很多种,下面我们就探究一下大家常用的几种方式: 枚举类 public enum TestEnum {ONE(1,"one&qu ...

  9. html中可以添加几个类,从一个类中向一个HtmlHead对象添加多个元素

    我有一个页面的网站.我有4页所有页面都使用的主页面.每个页面使用不同的CSS和JavaScript头部标签内部.我想通过调用引用数据库表的类来添加标题,元描述和元关键字标记.但是,我无法找到一种方法将 ...

最新文章

  1. Windows下Hadoop的环境安装[转]
  2. 《从零开始学Swift》学习笔记(Day 7)——Swift 2.0中的print函数几种重载形式
  3. <table/>默认适应内容宽度造成滚动条不显示的解决方法
  4. 聊聊我们在业务链路升级中做的数据洞察
  5. 小米3c路由器拆机_小米AC2350无线路由器拆机-路由器交流
  6. crmeb pro版获取短信验证码失败解决方法
  7. Nokia于MWC再出手机9 PureView 6颗镜头受到瞩目
  8. 虚拟服务器不识别网银盾,电脑浏览器无法使用建行E路航网银盾的解决方法
  9. 斯坦福大学自然语言处理第四课 语言模型(Language Modeling)笔记
  10. NRF24L01 无线模块
  11. Ubuntu中安装和使用vim
  12. 科研画图都用什么软件
  13. Cocos2d-x 2.0 网格动画深入分析
  14. 设置IE主页的几种方法
  15. protocol buffer namespace conflict
  16. 寒江独钓(2):串口的过滤
  17. 阿里云mysql测试_MySQL主主测试-阿里云开发者社区
  18. 国民技术GPIO配置推挽输出模式
  19. AV终结者病毒大全及防范
  20. 迷你歌词(MiniLyrics)破解小记

热门文章

  1. Android Studio提示“unable to find valid certification“的解决办法 勾上Accept non-trusted certificates automa就行
  2. Vaa3d_修改生成的dll名_pro文件
  3. 计算机专业主要学习什么
  4. (NO.00001)iOS游戏SpeedBoy Lite成形记(二十)
  5. 面试官:你期望薪资多少?你真的会答吗?你的回答是否是面试官想要的呢?
  6. 分区依据字段要不要再建索引
  7. html界面前台拼接base64加密后的图片
  8. 南大通用数据库-Gbase-8a-学习-25-常用系统表查询语句
  9. branch什么意思中文翻译_日本街头被“玩坏”的中文翻译,你能忍到第几条?
  10. 桌面开始和快捷方式消失了