在ServletContextListener实现类中获取spring注入对象
由于项目需要,需在ServletContextListener监听接口实现类中调用spring注入的对象,以获取系统初始化参数.代码如下:
- import java.io.IOException;
- import java.util.List;
- import javax.servlet.ServletContextEvent;
- import javax.servlet.ServletContextListener;
- import org.springframework.web.context.WebApplicationContext;
- import org.springframework.web.context.support.WebApplicationContextUtils;
- import pams.model.Device;
- import pams.service.Impl.DeviceManage;
- import pams.socket.TcpManager;
- import pams.socket.TcpServer;
- /**
- * 系统初始化
- * @author 恶灵骑士
- *
- */
- public class SysInitServlet implements ServletContextListener {
- //获取spring注入的bean对象
- private WebApplicationContext springContext;
- private DeviceManage deviceManager;
- //数据采集仪服务线程
- TcpServer daqServer = null;
- //继电器服务线程
- TcpServer realyServer = null;
- //Tcp连接管理器
- Thread tcpManager = null;
- public SysInitServlet(){
- super();
- }
- /**
- *应用程序退出时调用
- */
- @Override
- public void contextDestroyed(ServletContextEvent event) {
- serverDestroyed();
- System.out.println("应用程序关闭!");
- }
- /**
- * 应用程序加载时调用
- */
- @Override
- public void contextInitialized(ServletContextEvent event) {
- springContext = WebApplicationContextUtils.getWebApplicationContext(event.getServletContext());
- if(springContext != null){
- deviceManager = (DeviceManage)springContext.getBean("deviceManage");
- }else{
- System.out.println("获取应用程序上下文失败!");
- return;
- }
- System.out.println("初始化系统服务!");
- serverInitialized();
- System.out.println("TcpServer初始化完成!");
- }
- /**
- * 系统服务初始化
- * device_type:由于只需要知道采集仪,继电器端口号
- * 所以device_type设置为0
- */
- public void serverInitialized(){
- if(deviceManager == null){
- System.out.println("获取设备管理器失败!");
- return;
- }
- List<Device> devices = this.deviceManager.load(0);
- for(Device device : devices){
- System.out.println("设备ID-->"+device.getId());
- System.out.println("采集仪端口号-->"+device.getProperty1());
- System.out.println("继电器端口号-->"+device.getProperty2());
- System.out.println("所属大棚-->"+device.getShed().getName());
- }
- //开启串口服务器-数据采集仪监听线程
- TcpServer daqServer = new TcpServer(5678);
- TcpServer realyServer = new TcpServer(5679);
- tcpManager = new Thread(new TcpManager());
- if(daqServer.getServer() != null)
- {
- new Thread(daqServer).start();
- }
- if(realyServer.getServer()!=null){
- new Thread(realyServer).start();
- }
- tcpManager.start();
- }
- /**
- * 系统服务注销
- */
- @SuppressWarnings("deprecation")
- public void serverDestroyed(){
- if(daqServer!=null){
- try {
- daqServer.getServer().close();
- } catch (IOException e) {
- System.out.println("数据采集仪服务线程关闭出错 --> "+e.getMessage());
- }
- }
- if(realyServer!=null){
- try {
- realyServer.getServer().close();
- } catch (IOException e) {
- System.out.println("继电器服务线程关闭出错 --> "+e.getMessage());
- }
- }
- if(tcpManager!=null){
- tcpManager.stop();
- }
- }
- }
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完成初始化,如下:
- <!--Spring ApplicationContext载入-->
- <listener>
- <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
- </listener>
- <!-- Spring ApplicationContext配置文件的路径,此参数用于后面的Spring-Contextloader -->
- <context-param>
- <param-name>contextConfigLocation</param-name>
- <param-value>classpath:beans.xml</param-value>
- </context-param>
- lt;!-- 系统服务初始化 -->
- <listener>
- <listener-class>pams.servlet.SysInitServlet</listener-class>
- </listener>
如果想在外部类中调用通过这种方法得到的spring对象,可以把springContext设为static,然后提供相应的get方法,此处由于不需要故设为private..
在ServletContextListener实现类中获取spring注入对象相关推荐
- spring初始化在ServletContextListener实现类中获取spring注入对象
查了好多资料,发现还是不全,干脆自己整理吧,至少保证在我的做法正确的,以免误导读者,也是给自己做个记录吧! 由于项目须要,需在ServletContextListener监听接口实现类中调用sprin ...
- 【SpringBoot】在普通类中获取spring容器中的bean
这段时间公司搞封闭开发,做一个联通总部的客服系统项目,是基于springboot的.在开发工程中遇到一个页面datagrid数据排序的功能,因为有多个表的数据都要用到排序功能,于是我就写了一个排序功能 ...
- 在普通类中获取spring容器中的bean
在普通类中获取spring容器中的bean 1.工具类 package com.itheima.hchat.util;import org.springframework.beans.BeansExc ...
- java 普通类request_[Java教程]spring在普通类中获取session和request
[Java教程]spring在普通类中获取session和request 0 2014-08-12 08:01:13 在使用spring时,经常需要在普通类中获取session,request等对像. ...
- 170630、springboot编程之普通类中调用spring管理的bean对象
我们知道如果我们要在一个类使用spring提供的bean对象,我们需要把这个类注入到spring容器中,交给spring容器进行管理,但是在实际当中,我们往往会碰到在一个普通的Java类中,想直接使用 ...
- java-在应用中获取spring定义的bean
因为写了些bean作为quartz的任务用spring配置了,但有些时候需要在别的类中使用这些bean,没有太仔细去研究spring,依稀记得有个getBean,到网上g了一把,发现方法不止一种,选了 ...
- java 获取继承字段_java – 从类中获取所有字段(甚至是私有的和继承的)
我在做大学项目. 我需要从类中获取所有字段.甚至私人和继承.我试图获取所有声明字段,然后投射到超类并重复. 我的代码片段: private void listAllFields(Object obj) ...
- 枚举类中获取枚举值的几种方法
在开发的过程中我们经常会定义枚举类,枚举类中获取枚举值的方式也有很多种,下面我们就探究一下大家常用的几种方式: 枚举类 public enum TestEnum {ONE(1,"one&qu ...
- html中可以添加几个类,从一个类中向一个HtmlHead对象添加多个元素
我有一个页面的网站.我有4页所有页面都使用的主页面.每个页面使用不同的CSS和JavaScript头部标签内部.我想通过调用引用数据库表的类来添加标题,元描述和元关键字标记.但是,我无法找到一种方法将 ...
最新文章
- Java Web技术经验总结(二)
- 我这样写代码,比直接使用 MyBatis 效率提高了 100 倍
- numpy.random.rand使用详解
- 文件传送到服务器的软件,远程服务器文件传输软件
- ios下划线变量:为什么变量前要加下划线才有用?
- swift string转int_swift中结构体和类的区别(值类型和引用类型的区别)
- angular js实现开关效果
- 在Windows上,迁移VisualSVN server
- 【转】TFS签入签出规范
- STM32之CAN总线例程
- Windows 下使用 MinGW 和 CMake 进行开发
- redis 公网 安全_最安全redis公网访问
- [导入]mootools框架【三】-Array篇: 方法完全解析
- 使用canvas上传图片+上传进度
- 计算机维护教程自学,【电脑维修教程】自学维修电脑.pdf
- 设置局域网内共享磁盘
- VirtualBox虚拟机安装
- JUNIPER路由器中常用命令总结
- linux中来宾用户权限,linux权限分配
- [agc012e]Camel and Oases
热门文章
- 最难游戏2计算机5关,史上最牛的游戏2攻略 史上最牛的游戏1~5关攻略
- 一次只做一件事,并做到最好!
- 亚马逊遭遇TRO,账户冻结,卖家朋友该如何自处?
- Qt建立文件夹、判断文件夹是否存在、文件夹是否为空、清空文件夹
- 朋友问我,你都30岁了学编程来得及吗
- [原创]ACPI.sys,从Windows到Bios的桥梁(2):Windows应用程序响应主板上GPIO(SCI)设备中断 软件篇
- 当面试官说刚入职工资不高时该怎么回答呢
- 2023计算机毕业设计SSM最新选题之java企业物资管理系统h3109
- 最新纯净版win7系统下载
- 7-5 计算职工工资 (15分)