实现ApplicationContextAware接口完成springboot项目的初始化处理工作

本文主要是介绍实现ApplicationContextAware接口完成springboot项目的初始化处理工作,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

需求:在项目启动的时候,从数据库里取出所有敏感词,放到map里面。

  • ApplicationContextAware 的实现类的setApplicationContext方法可以获取到IOC容器,虽然这个案例里面并没有什么用,但是项目初始化一般实现ApplicationContextAware 接口
  1. 核心代码
@Component
public class InitLoadService implements ApplicationContextAware {@Autowiredprivate WmSensitiveMapper wmSensitiveMapper;/**** IOC容器* @param applicationContext* @throws BeansException*/@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {//1)查询敏感词List<WmSensitive> wmSensitives = wmSensitiveMapper.selectList(null);//2)敏感词填充到hashmap中//List<String> list = new ArrayList<String>();//for (WmSensitive wmSensitive : wmSensitives) {//    list.add(wmSensitive.getSensitives());//}List<String> list = wmSensitives.stream().map(WmSensitive::getSensitives).collect(Collectors.toList());SensitiveWordUtil.initMap(list);}
}
  1. 工具类
public class SensitiveWordUtil {//存储所有敏感词public static Map<String, Object> dictionaryMap = new HashMap<>();/*** 生成关键词字典库* @param words* @return*/public static void initMap(List<String> words) {if (words == null) {System.out.println("敏感词列表不能为空");return ;}// map初始长度words.size(),整个字典库的入口字数(小于words.size(),因为不同的词可能会有相同的首字)Map<String, Object> map = new HashMap<>(words.size());// 遍历过程中当前层次的数据Map<String, Object> curMap = null;Iterator<String> iterator = words.iterator();while (iterator.hasNext()) {String word = iterator.next();curMap = map;int len = word.length();for (int i =0; i < len; i++) {// 遍历每个词的字String key = String.valueOf(word.charAt(i));// 当前字在当前层是否存在, 不存在则新建, 当前层数据指向下一个节点, 继续判断是否存在数据Map<String, Object> wordMap = (Map<String, Object>) curMap.get(key);if (wordMap == null) {// 每个节点存在两个数据: 下一个节点和isEnd(是否结束标志)wordMap = new HashMap<>(2);wordMap.put("isEnd", "0");curMap.put(key, wordMap);}curMap = wordMap;// 如果当前字是词的最后一个字,则将isEnd标志置1if (i == len -1) {curMap.put("isEnd", "1");}}}dictionaryMap = map;}/*** 搜索文本中某个文字是否匹配关键词* @param text* @param beginIndex* @return*/private static int checkWord(String text, int beginIndex) {if (dictionaryMap == null) {throw new RuntimeException("字典不能为空");}boolean isEnd = false;int wordLength = 0;Map<String, Object> curMap = dictionaryMap;int len = text.length();// 从文本的第beginIndex开始匹配for (int i = beginIndex; i < len; i++) {String key = String.valueOf(text.charAt(i));// 获取当前key的下一个节点curMap = (Map<String, Object>) curMap.get(key);if (curMap == null) {break;} else {wordLength ++;if ("1".equals(curMap.get("isEnd"))) {isEnd = true;}}}if (!isEnd) {wordLength = 0;}return wordLength;}/*** 获取匹配的关键词和命中次数* @param text* @return*/public static Map<String, Integer> matchWords(String text) {Map<String, Integer> wordMap = new HashMap<>();int len = text.length();for (int i = 0; i < len; i++) {int wordLength = checkWord(text, i);if (wordLength > 0) {String word = text.substring(i, i + wordLength);// 添加关键词匹配次数if (wordMap.containsKey(word)) {wordMap.put(word, wordMap.get(word) + 1);} else {wordMap.put(word, 1);}i += wordLength - 1;}}return wordMap;}public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("语文");list.add("数学");list.add("英语");initMap(list);String content="我英语很菜";Map<String, Integer> map = matchWords(content);System.out.println(map);}
}

这篇关于实现ApplicationContextAware接口完成springboot项目的初始化处理工作的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/970243

相关文章

C:单链表的简单实现

前言 今天整理资料的时候翻出来的文件,发现是以前学习数据结构的时候写的代码,当初是看郝凯老师的视频学习的C语言的数据结构,下面是对于一个单链表的简单的实现。 /*******************************************************************************@file SingleLinker.c*@version V1.0

C:简单实现BaseCode64编码

What is Base64? 前言 目前来看遇到过Base 16、Base 32、Base 64的编解码,这种编码格式是二进制和文本编码转化,是对称并且可逆的转化。Base 64总共有64个ASCII码字符,包括A-Z,a-z,0-9,“+”和“/ ”。详细介绍可以参考了这篇文章,对Base 64的原理做了比较详细的介绍。 编码原理 转换 Base 64编码的64个ASCII字符需要6

Linux 内核工作队列之work_struct 学习总结

前言 编写Linux驱动的时候对于work_struct的使用还是很普遍的,很早之前就在阅读驱动源码的时候就看到了它的踪影,根据其命名大概知道了它的具体作用,但是仍然不知所以,同时,伴随出现的还有delayed_work以及workqueue_struct,抱着知其然并知其所以然的态度,在这里归纳总结一下work_struct,以及如何在驱动中使用,因为工作队列相对来说比较复杂,篇幅和能力有限,

有感FOC算法学习与实现总结

文章目录 基于STM32的有感FOC算法学习与实现总结1 前言2 FOC算法架构3 坐标变换3.1 Clark变换3.2 Park变换3.3 Park反变换 4 SVPWM5 反馈部分5.1 相电流5.2 电角度和转速 6 闭环控制6.1 电流环6.2 速度环6.3 位置环 写在最

一分钟了解芯片工作的心脏

本文作者:芯博士 晶振概念:在振荡器中采用一个特殊的元件——石英晶体,它可以产生频率高度稳定的交流信号,这种采用石英晶体的振荡器称为晶体振荡器,简称晶振。 制作方法:从一块石英晶体上按一定方位角切下薄片(简称为晶片,它可以是正方形、矩形或圆形等),在它的两个对应面上涂敷银层作为电极,在每个电极上各焊一根引线接到管脚上,再加上封装外壳就构成了晶振器,常见的有DIP(插脚类)和SMD(插片类)。

开源一个电子胸牌项目,很棒!

摘要:关注RT-Thread的同学肯定知道,RT-Thread为了向众多开发者展示RT-Thread的最新开发和生态建设成果,每年都会举办一场开发者大会(简称:RDC),在2020年度的开发者大会上,RT-Thread给到现场的每个开发者们都发放了一个电子胸牌,胸牌的名称起名为ART-Bagde。 一、ART-Badge是什么? 首先附上两张渲染图↓ 二、功能设计 首先让我们看一下,今年的

马斯克的脑机接口,一块树莓派就能做出来?

点击上方“小麦大叔”,选择“置顶/星标公众号” 福利干货,第一时间送达 大家好,我是小麦。 想必大家都听说过马斯克,还有特斯拉,SpaceX以及脑机接口。 前两个太难了,但是现在只需要一块树莓派的板子,就可以做一个低配版的脑机接口? 没有开玩笑,这位俄罗斯小哥Rakhmatulin还真做出来了。 这接地气的设备只用一块树莓派板子做处理器,可以实时处理八个大脑电信号: 不信来看看实时信号图像:

测试服务搭建之centos7下安装java

一 安装Java 1 创建普通用户 useradd userNameTest passwd userNameTest 提示输入密码:【输入wujian的密码】 user:userNameTest group:root passwd:123456789   2 给“userNameTest”分配root权限 vi /etc/sudoers 在文件中找到 # %wheel ALL=(

十分钟搞定接口功能测试

如果你和我一样菜,请快速看一下如何快速测试接口! ================== 1 安装python环境,这里请大家百度! 2 下载python模块:链接: https://pan.baidu.com/s/1hsByrdE 密码: 4gya 3 将模块解压后放到D:\Python\Python36这个目录下,即:python36的home目录! 4 cmd到D:\Python\Pytho

github 初始化操作小记

Git作为一种越来越重要的工具,github又如此流行,现在就简单记录一下git的基础操作,希望能帮助大家快速体验入门! 1 查看本地是否存在”公钥”和”私钥”  转存失败重新上传取消  如果没有,则执行:    ssh-keygen  -t rsa –C “youremail@example.com”   2 github上新建SSH key,可能key会有红线,放心不会报错!