本文主要是介绍实现ApplicationContextAware接口完成springboot项目的初始化处理工作,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
需求:在项目启动的时候,从数据库里取出所有敏感词,放到map里面。
- ApplicationContextAware 的实现类的setApplicationContext方法可以获取到IOC容器,虽然这个案例里面并没有什么用,但是项目初始化一般实现ApplicationContextAware 接口
- 核心代码
@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);}
}
- 工具类
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项目的初始化处理工作的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!