由于项目需要,需在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. Java Web技术经验总结(二)
  2. 我这样写代码,比直接使用 MyBatis 效率提高了 100 倍
  3. numpy.random.rand使用详解
  4. 文件传送到服务器的软件,远程服务器文件传输软件
  5. ios下划线变量:为什么变量前要加下划线才有用?
  6. swift string转int_swift中结构体和类的区别(值类型和引用类型的区别)
  7. angular js实现开关效果
  8. 在Windows上,迁移VisualSVN server
  9. 【转】TFS签入签出规范
  10. STM32之CAN总线例程
  11. Windows 下使用 MinGW 和 CMake 进行开发
  12. redis 公网 安全_最安全redis公网访问
  13. [导入]mootools框架【三】-Array篇: 方法完全解析
  14. 使用canvas上传图片+上传进度
  15. 计算机维护教程自学,【电脑维修教程】自学维修电脑.pdf
  16. 设置局域网内共享磁盘
  17. VirtualBox虚拟机安装
  18. JUNIPER路由器中常用命令总结
  19. linux中来宾用户权限,linux权限分配
  20. [agc012e]Camel and Oases

热门文章

  1. 最难游戏2计算机5关,史上最牛的游戏2攻略 史上最牛的游戏1~5关攻略
  2. 一次只做一件事,并做到最好!
  3. 亚马逊遭遇TRO,账户冻结,卖家朋友该如何自处?
  4. Qt建立文件夹、判断文件夹是否存在、文件夹是否为空、清空文件夹
  5. 朋友问我,你都30岁了学编程来得及吗
  6. [原创]ACPI.sys,从Windows到Bios的桥梁(2):Windows应用程序响应主板上GPIO(SCI)设备中断 软件篇
  7. 当面试官说刚入职工资不高时该怎么回答呢
  8. 2023计算机毕业设计SSM最新选题之java企业物资管理系统h3109
  9. 最新纯净版win7系统下载
  10. 7-5 计算职工工资 (15分)