springmvc框架定时器功能实现和service注入问题解决

2023-10-27

1、在SpringMVC配置文件中添加

xmlns:task="http://www.springframework.org/schema/task" 
http://www.springframework.org/schema/task  
http://www.springframework.org/schema/task/spring-task-3.2.xsd 

配置任务扫描

<task:annotation-driven />

配置扫描任务位置

<!-- 扫描任务 -->
    <context:component-scan base-package="com.vrveis.roundTrip.task" />

2、如果定时器方法单独写在一个工具类里,没有配置扫描该文件夹,注入service就会失败,可以通过SpringContextUtil类调用

具体代码如下:

package com.test.controller.base;
import org.apache.log4j.Logger;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

/**
 * 在Spring 注解中,普通类获取@Service标记的方法或者bean对象
 */
@Component
public class SpringContextUtil implements ApplicationContextAware {
    private static Logger logger = Logger.getLogger(SpringContextUtil.class);
    private static ApplicationContext applicationContext = null;

    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException
    {
        logger.info("------SpringContextUtil setApplicationContext-------");
        SpringContextUtil.applicationContext = applicationContext;
    }

    public static ApplicationContext getApplicationContext() {
        return applicationContext;
    }

    /**
     * 注意 bean name默认 = 类名(首字母小写)
     * 例如: A8sClusterDao = getBean("a8sClusterDao")
     * @param name
     * @return
     * @throws BeansException
     */
    public static Object getBean(String name) throws BeansException {
        return applicationContext.getBean(name);
    }

    /**
     * 根据类名获取到bean
     * @param <T>
     * @param clazz
     * @return
     * @throws BeansException
     */
    @SuppressWarnings("unchecked")
    public static <T> T getBeanByName(Class<T> clazz) throws BeansException {
        try {
            char[] cs=clazz.getSimpleName().toCharArray();
            cs[0] += 32;//首字母大写到小写
            return (T) applicationContext.getBean(String.valueOf(cs));
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        } 
    }

    public static boolean containsBean(String name) {
        return applicationContext.containsBean(name);
    }

    public static boolean isSingleton(String name) throws NoSuchBeanDefinitionException {
        return applicationContext.isSingleton(name);
    }

}
调用方法:

//获取 Bean  注意bean的首字母小写
   RcpqService rcpqService=(RcpqService) SpringContextUtil.getBean("rcpqService");

3、利用监听器,实现定时器功能:

在web.xml中设置监听器:

<listener>
    <listener-class>com.test.listener.MyTimerTaskListener</listener-class>
  </listener>

监听器代码如下:

package com.test.listener;

import java.util.Calendar;
import java.util.Timer;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import com.test.util.MyTimerTask;
/**
 * @author snwei
 */
public class MyTimerTaskListener implements ServletContextListener {
    private Timer timer = null;
    @Override
    public void contextDestroyed(ServletContextEvent arg0) {
        timer.cancel();
    }

    @Override
    public void contextInitialized(ServletContextEvent arg0) {
        System.out.println("-----开始启动定时器------");
        Calendar firstStart = Calendar.getInstance();
        firstStart.set(Calendar.HOUR_OF_DAY, 0);
        firstStart.set(Calendar.MINUTE, 10);
        firstStart.set(Calendar.SECOND, 0);
        timer = new Timer(true);
        //第一次是凌晨0:10:00执行,间隔24小时执行一次
        timer.schedule(new MyTimerTask(), firstStart.getTime(), 1000*60*60*24);
        
        //timer.scheduleAtFixedRate(task, delay, intevalPeriod);//严格按照调度时间来的,时间不会顺延
    	//timer.schedule(task, new Date(), intevalPeriod);//如果某一次调度时间比较长,那么后面的时间会顺延,保证调度间隔
        //timer.scheduleAtFixedRate(new MyTimerTask(), 0, 1000*60*10);  //测试
    }
}
定时器业务代码如下:

package com.test.util;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.TimerTask;
import com.test.controller.base.SpringContextUtil;
import com.test.service.manager.rcpq.RcpqService;
/**
 * 定时器
 */
public class MyTimerTask extends TimerTask{
    @Override
    public void run() {
    	//获取 Bean
    	RcpqService rcpqService=(RcpqService) SpringContextUtil.getBean("rcpqService");
	//调用service方法,业务代码实现
	...
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

springmvc框架定时器功能实现和service注入问题解决 的相关文章

  • Pytorch加速与优化:超参数调优、量化、剪枝

    Pytorch加速与优化 超参数调优 量化 剪枝 前言 前提条件 相关介绍 实验环境 超参数调优 hyper parameters 量化 quantization 动态量化 Dynamic quantization 后训练静态量化 Post
  • python中dataframe怎么去重_pandasdataframe重复数据查看.判断.去重

    Apple iPhone 11 A2223 128GB 黑色 移动联通电信4G手机 双卡双待 4999元包邮 去购买 gt 本文详解如何使用pandas查看dataframe的重复数据 判断是否重复 以及如何去重 dataframe数据样本
  • python数据容器--五类数据容器的总结对比

    python数据容器 五类数据容器的总结对比 列表 元组 字符串 集合 字典 下标索引 是 是 是 否 否 重复元素 是 是 是 否 否 是否可修改 是 否 否 是 是 适用场景 一批数据 可修改 可重复的存储场景 一批数据 不可修改 可重
  • 5 spring事件与监听器

    Spring的事件 1概述 ApplicationEvent以及Listener是Spring为我们提供的一个事件监听 订阅的实现 内部实现原理是观察者设计模式 设计初衷也是为了系统业务逻辑之间的解耦 提高可扩展性以及可维护性 2组成 Ap
  • android图片压缩上传

    一 调用webservice接口 传的参数是String类型的参数 需要把Bitmap转换为String类型 byte arrayOfByte CommUtil Bitmap2Bytes DangerPointSubmitActivity
  • 关于phpStudy的Less-26空格被过滤使用%a0变乱码无法执行应该带有空格的查询语句

    我的实验环境是 C phpStudy PHPTutorial WWW sqli labs master Less 26 练习sql inject 注入练习第26关 Less 26 输入的空格被过滤了 提示中明显指出select 和 1之间的
  • 腾讯云:MySQL数据库的高可用性分析

    作者介绍 易固武 腾讯高级工程师 参与腾讯账号安全建设 腾讯数据仓库 TDW 优化改造 腾讯云数据库等项目 对大规模分布式存储和计算系统有浓厚的兴趣和经历 MySQL数据库是目前开源应用最大的关系型数据库 有海量的应用将数据存储在MySQL
  • git pull出现Abort没有原因提示

    使用git pull更新时 出现文件冲突 将冲突文件解决后 再进行pull操作 出现abort 但是没有提示原因 这是由于直接在子文件夹下进行pull操作 而其他级别的文件夹下出现也出现文件冲突 而git发现了冲突但是由于不在当前目录下没有
  • 教你一招:解决u盘插入计算机时提示格式化,如何恢复u盘中的文件

    1 插入U盘时 计算机提示格式化 看到这里 到底是格不格呢 别怕 随便你了 2 查看U盘属性 发现都为零 怎么办呢 u盘上面有很多重要文件啊 别急 继续往下看 3 解决办法 1 下载DiskGenius硬盘恢复软件 安装后打开 软件官方下载
  • 招聘数据采集+数据清洗与分析+数据可视化

    1 需求 1 1 数据采集 1 网站解析 利用 chrome 查看网页源码 分析招聘网站网页结构 1 检查 招聘网站 在网页中右键点击检查 或者 F12 快捷键 进入 如下图的查看元素页面 示例图 1 2 检查网站 点击 Network 勾
  • oracle 9i下在线重定义表

    9i提供了联机重定义表的方法 可以让你在基本不影响原表的DML情况下修改表结构 实际上 联机重定义表并不是完全的联机重定义 在最后交换表名的时候会短暂地锁定原表和中间表 但这个过程很短暂 相对于传统方法来说 这是一个进步 9i提供了联机重定
  • 三千书源——愿成为整理最全的书源合集

    引言 古有弱水三千 今有三千书源 勿埋我心 三千大世界 三千书之源 随着 三千书源 渐渐变得充足起来 感谢收藏 希望可以多来看望勿埋我心 注意 现在主流是3 0书源 欢迎在评论区投稿不错的书源 软件下载 3 0 推荐使用 酷安 Github
  • MTSC2020

    MTSC2020中国互联网测试开发大会深圳站 于 2020 年 11 月 20 日至 21 日在深圳宝立方国际酒店召开 为中国质量保证行业奉上一场为期 2 天的技术盛宴 500 来自世界各地的测试精英们汇聚一堂探讨交流 来自阿里巴巴淘系技术
  • CTF新手题

    CTF Capture The Flag 是一种网络安全技能竞赛 它涉及到多个领域 如密码学 逆向工程 漏洞利用 Web安全等 每个比赛都会有多个题目 每个题目都有一个旗帜 玩家需要通过解决问题 攻击漏洞或破解密码等手段 获取旗帜并提交给比

随机推荐

  • MySQL最全面的优化技巧

    如果面试官问你 你会从哪些维度进行 MySQL 性能优化 你会怎么回答 所谓的性能优化 一般针对的是MySQL查询的优化 既然是优化查询 我们自然要先知道查询操作要经过哪些环节 然后思考可以在哪些环节进行优化 查询操作需要经历的基本环节 S
  • FBX SDK快速简笔(基本)

    FBX SDK快速简笔 摘至官方文档 因不开源 大部分地方官方文档中存在保密 以个人理解进行了一部分的推导 该文章免费并承诺不涉及如何利益 FBX模型的组织结构 FBX是以scene graph的结构来存储模型的所有信息 也可以认为是一个多
  • Weka内置特征选择算法整理

    属性评估方法 CfsSubsetEval 根据属性子集中每一个特征的预测能力以及它们之间的关联性进行评估 ChiSquaredAttributeEval 根据与分类有关的每一个属性的卡方值进行评估 ClassifierSubsetEval
  • Vue基础精讲 —— 详解Vue实例、Vue实例的属性和方法

    Vue实例 基本配置 在 build文件夹 下新建 webpack config practice js 配置文件 内容参考 const path require path const HTMLPlugin require html web
  • Flex4,textArea控件的htmlText属性

    它现在包含Text布局框架 Text Layout Framework TLF 而TLF可以作为许多 Spark text组件的基础 例如RichText RichEditableText TextArea和 TextInput等组件 以及
  • 突发奇想把云服务器刷成了黑群晖 ...

    大家好 我是鸟哥 一个半路出家的程序员 前两天准备把自己10年前买的戴尔电脑刷成黑群晖改造成一台家庭存储服务器 折腾了几天后结果把电脑刷成了蓝屏 彻底报废了 后来又突发奇想 准备把手头上的服务器刷成黑群晖 本以为是无法成功的事 结果却很顺利
  • Ubuntu安装Docker

    一 安装条件 1 操作系统要求 需要以下 Ubuntu 版本之一的 64 位版本 Ubuntu Kinetic 22 10 Ubuntu Jammy 22 04 LTS Ubuntu Focal 20 04 LTS Ubuntu Bioni
  • Oracle数据库预警信息阈值设置以及预警信息自动邮件发送到管理员邮箱

    当数据库处于不理想状态时 默认情况下会通过EM发出预警 也可以通过邮件发送给管理员 要设置电子邮件通知 可在EM上 1任何 Database Control 页中 单击页眉和页脚区中的 Setup 设置 链接 2 在 Setup 设置 页中
  • 工作遇到的问题:mybatis注解@Param和分页count

    目录 mybatis注解 Param 分页Count mybatis注解 Param 基于mybatis注解写sql 出现了一个对象映射问题 一开始我没用 Param 因为当时只有一个入参所以没写springboot是能识别到的 但是我后来
  • boost1.79编译

    系列文章目录 文章目录 系列文章目录 前言 一 编译 1 使用vs2019 命令行 用管理员身份运行 2 执行命令 2 第二种方法 3 boost编译动态库 参考 前言 boost自带一套编译工具bjam bjam本身是跨平台的 并且也要自
  • uni-app 后台升级 静默升级 uniapp 后台更新 静默更新 在线升级

    uni app开发到一段落了 最后的app更新好好搞一下 完美的收尾 哈哈哈 在uni app的文档中可以看到内置了HTML5 引擎 这样我们就可以通过JS语法直接调用Native Java接口通道 可调用几乎所有的系统原生Java API
  • ZIP 软件包管理

    ZIP 也是计算机文件的压缩的算法 原名 Deflate 真空 发明者为菲利普 卡兹 Phil Katz 他于 1989 年 1 月公布了该格式的资料 ZIP 通常使用后缀名 zip 主流的压缩格式包括 tar rar zip war gz
  • C#软件加序列号激活、试用期限

    道高一尺 魔高一丈 程序员想尽各种办法给软件加密 用户就想尽各种办法对软件破解 现在做软件试用限制 那么就讨论下软件的试用限制 总体来说 限制的方法有这么几种 1 时间限制 2 次数限制 以时间限制为例 主要是用户从安装之日起 限制用户使用
  • 2023华为OD机试真题【预定酒店/自定义排序】

    题目描述 放暑假了 小明决定到某旅游景点游玩 他在网上搜索到了各种价位的酒店 长度为n的 数组A 他的心理价位是x元 请帮他筛选出k个最接近x元的酒店 n gt k gt 0 并由低到高打印酒店的价格 输入描述 第一行 n k x 第二行
  • Github域名加上1s,在线VS Code阅读源码神器诞生

    近日 一款域名为 github1s 开源项目诞生了 正如他的名字所说 只要在 github 地址上面加上 1s 就能秒级用在线 VS Code 打开 github 项目 这可以说为开发者带来了巨大的便利 我们来看看这个项目打开后长什么样子
  • go get或go mod tidy报错 fatal: could not read Username for

    go get git xxxxx net CPC protocol module git xxxxx net CPC protocol git ls remote q origin in Users admin go pkg mod cac
  • STM32 基础系列教程 24 - USB_HID_key

    前言 学习stm32 USB接口使用 学会用CUBE工具快速创建USB设备工程及调试 关于usb的相关知道请读者提前准备并学习 当然如果不想深究其中原理的话 跟着本文来操作就可以实现基于USB的设备开发了 需要提示的是 stm32在使用us
  • 【蓝屏解决】笔记本频繁蓝屏,错误代码IRQL_NOT_LESS_OR_EQUAL

    问题发现 笔记本近期频繁蓝屏 最初几天会出现一次 后面10分钟左右就出现一次蓝屏情况 解决方案 Step1 找到崩溃日志 Win10 的崩溃日志保存在 C Windows Minidump 里 Step2 下载Debugging Tools
  • AIX系统启动

    复杂度2 5 机密度3 5 最后更新2021 04 23 AIX的启动过程粗略来看 大概是这样的 其中有通过硬件 微码 只能调整少量设置 完成的过程 也有通过操作系统软件 可修改 完成的功能 to be continue 关于SMS的介绍在
  • springmvc框架定时器功能实现和service注入问题解决

    1 在SpringMVC配置文件中添加 xmlns task http www springframework org schema task http www springframework org schema task http ww