springboot自动装配 + java敏感词匹配

1. 项目准备

deploy项目 :  https://gitee.com/hctrl/deploy

word-spring-boot-starter : word-spring-boot-start: 敏感词匹配jar

项目已经上传到gitee, 大家可以自行下载查看

2. springboot自动装配必要的步骤

1. resource/META-INF/spring.factories

2. 一个被@Configuration注解修饰的类

3. 一个被@ConfigurationProperties注解修饰的类, 用来读取配置,

项目目录如下 :

接下来我们看一下每个文件的内容

spring.factories

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.hctrl.wordspringbootstart.autoConfig.config.SensitiveWordAutoConfiguration

接下来看一下自动装配的类实现

com.hctrl.wordspringbootstart.autoConfig.config.SensitiveWordAutoConfiguration

@Configuration
@EnableConfigurationProperties({SensitiveWordProperties.class, ConvertedRuleProperties.class})
public class SensitiveWordAutoConfiguration {@Beanpublic SensitiveWordFilter sensitiveWordFilter(SensitiveWordProperties sensitiveWordProperties,ConvertedRuleProperties convertedRuleProperties){SensitiveWordFilter sensitiveWordFilter = new SensitiveWordFilter();Map<Character, Object> map = new HashMap<>();if (sensitiveWordProperties.getSensitiveWordList() != null){map = ProcessWordMapUtil.process(sensitiveWordProperties.getSensitiveWordList());}sensitiveWordFilter.setSensitiveWordMap(map);if (convertedRuleProperties.getMatchType() != null){sensitiveWordFilter.setMatchType(convertedRuleProperties.getMatchType());}if (convertedRuleProperties.getConvertedChar() != null){sensitiveWordFilter.setConvertedChar(convertedRuleProperties.getConvertedChar());}return sensitiveWordFilter;}}

接下来分别看一下两个配置类的内容

@ConfigurationProperties(prefix = "converted.rule")
public class ConvertedRuleProperties {private String matchType;private String convertedChar;public String getMatchType() {return matchType;}public void setMatchType(String matchType) {this.matchType = matchType;}public String getConvertedChar() {return convertedChar;}public void setConvertedChar(String convertedChar) {this.convertedChar = convertedChar;}
}

@ConfigurationProperties(prefix = "word.match")
public class SensitiveWordProperties {private Set<String> sensitiveWordList;public Set<String> getSensitiveWordList() {return sensitiveWordList;}public void setSensitiveWordList(Set<String> sensitiveWordList) {this.sensitiveWordList = sensitiveWordList;}
}

再看一下自己配置装配的类的内容

package com.hctrl.wordspringbootstart.autoConfig.filter;import com.hctrl.wordspringbootstart.autoConfig.util.ProcessWordMapUtil;
import org.springframework.beans.factory.InitializingBean;import java.util.HashSet;
import java.util.Map;
import java.util.Set;/*** 敏感词过滤工具类** @author hctrl* @date 2021/12/29 20:38*/public class SensitiveWordFilter implements InitializingBean {public String matchType = "max";      // min : 最小匹配,  max: 最大匹配, 默认是最小匹配public String convertedChar = "*";        // 替换敏感词字符public Map<Character, Object> sensitiveWordMap;public Map<Character, Object> getSensitiveWordMap() {return sensitiveWordMap;}public void setSensitiveWordMap(Map<Character, Object> sensitiveWordMap) {this.sensitiveWordMap = sensitiveWordMap;}public String getMatchType() {return matchType;}public void setMatchType(String matchType) {this.matchType = matchType;}public String getConvertedChar() {return convertedChar;}public void setConvertedChar(String convertedChar) {this.convertedChar = convertedChar;}@Overridepublic void afterPropertiesSet() throws Exception {//自己可以进行扩展}/*** 判断文字是否包含敏感字符** @param txt       文字* @return 若包含返回true,否则返回false* @version 1.0*/public boolean isContainSensitiveWord(String txt) {boolean flag = false;for (int i = 0; i < txt.length(); i++) {int matchFlag = checkSensitiveWord(txt, i); //判断是否包含敏感字符if (matchFlag > 0) {    //大于0存在,返回trueflag = true;}}return flag;}/*** 检查文字中是否包含敏感字符,检查规则如下:** @param txt* @param beginIndex* @return,如果存在,则返回敏感词字符的长度,不存在返回0* @version 1.0*/public Integer checkSensitiveWord(String txt, int beginIndex) {boolean flag = false;    //敏感词结束标识位:用于敏感词只有1位的情况int matchFlag = 0;     //匹配标识数默认为0Map nowMap = sensitiveWordMap;for (int i = beginIndex; i < txt.length(); i++) {char word = txt.charAt(i);nowMap = (Map) nowMap.get(word);     //获取指定keyif (nowMap != null) {     //存在,则判断是否为最后一个matchFlag++;     //找到相应key,匹配标识+1if ("1".equals(nowMap.get("isEnd"))) {       //如果为最后一个匹配规则,结束循环,返回匹配标识数flag = true;       //结束标志位为trueif ("min".equals(matchType)) {    //最小规则,直接返回,最大规则还需继续查找break;}}} else {     //不存在,直接返回break;}}if (!flag) {        //长度必须大于等于1,为词matchFlag = 0;}return matchFlag;}/*** 敏感词转换* @param text  文本内容* @return*/public String changeSensitiveWord(String text) {int size = text.length();for (int i = 0; i < size; i++) {int length = checkSensitiveWord(text, i);    //判断是否包含敏感字符if (length > 0) {    //存在,加入list中text = converted(text, i, i + length);i = i + length - 1;    //减1的原因,是因为for会自增}}return text;}private String converted(String text, Integer startIndex, Integer endIndex) {String start = text.substring(0, startIndex);String end = text.substring(endIndex);StringBuilder stringBuilder = new StringBuilder();for (int i = startIndex; i < endIndex; i++) {stringBuilder.append(convertedChar);}return new StringBuilder().append(start).append(stringBuilder.toString()).append(end).toString();}public static void main(String[] args) {SensitiveWordFilter sensitiveWordFilter = new SensitiveWordFilter();Set<String> set = new HashSet<>();set.add("地上霜");set.add("举头");sensitiveWordFilter.setSensitiveWordMap(ProcessWordMapUtil.process(set));Boolean flag = sensitiveWordFilter.isContainSensitiveWord("床前明月光,疑是地上霜,举头望明月,低头思故乡");System.out.println(sensitiveWordFilter.changeSensitiveWord("床前明月光,疑是地上霜,举头望明月,低头思故乡"));System.out.println(flag);}}

最后就是通过这个bean来进行敏感词匹配的

springboot自动装配到此就完成了

最后进行打包就可以了

注意 :  打包时在pom文件中要加这个配置

springboot自动装配引用

在deploy项目中, 引入刚刚打包好的jar包

导入之后 ,  我们就可以在包库中找到我们导入的jar包了

之后就可以在配置文件中配置变量了

我们再写一个测试的controller

到此springboot自动装配和使用讲解完毕

手写springboot自动装配 autoConfiguration相关推荐

  1. 你还不会手写SpringBoot启动器吗

    Starter是什么 ? Spring Boot 对比 Spring MVC 最大的优点就是使用简单,约定大于配置.不用 Spring MVC 的时候,时不时被 xml 配置文件搞的晕头转向,冷不防还 ...

  2. 刨析 SpringBoot 自动装配原理,其实很简单

    J3 SpringBoot # 源码 # 自动装配 一日我在愉快得遨游时,看到有鱼友在问:SpringBoot 中引入了 Nacos 依赖为啥就可以直接使用 Nacos 中的相关功能呀! 认真思考了一 ...

  3. 【SpringBoot】Spring手动装配和SpringBoot自动装配

    文章目录 1. Warm up 1.1 setter注入 1.2 构造器注入 1.3 属性注入 2. Warm up again 2.1 基于XML的配置 2.2 基于JavaConfig类的配置 3 ...

  4. SpringBoot自动装配原理浅析

    Springboot自动装配原理 SpringBoot是当下J2EE最为流行的框架,它有着轻量,快捷等特点,让程序员们可以专注在业务逻辑的编写上,而不用花太多的力气在一些环境的配置,整合组件的配置上面 ...

  5. Springboot自动装配源码分析

    Springboot自动装配源码分析 1.从@SpringbootApplication点进去 2.可以看到核心的三个注解 @SpringbootConfiguration @EnableAutoCo ...

  6. 【理解springboot自动装配原理】

    理解springboot自动装配原理: 最近读了小马哥(mercyblitz)Springboot编程思想(核心篇),有了一些心得和感悟,分享给大家: 1. 官网介绍了激活自动装配的方法: * 文档提 ...

  7. 淘宝(SpringBoot自动装配原理)

    什么是 SpringBoot 自动装配 通过注解或者一些简单的配置就能在 Spring Boot 的帮助下实现某块功能 SpringBoot 是如何实现自动装配的 SpringBoot 的核心注解 S ...

  8. 面试终极宝典:Springboot自动装配原理

    Springboot的自动装配过程,网上大多都是罗列代码,即使看完了,也还存在很多的疑点.下面,这是我总结的在面试过程中介绍SpringBoot自动装配原理的话术,拿来即用就可. Springboot ...

  9. 面试高频题:springboot自动装配的原理你能说出来吗?

    引言 最近有个读者在面试,面试中被问到了这样一个问题"看你项目中用到了springboot,你说下springboot的自动配置是怎么实现的?"这应该是一个springboot里面 ...

最新文章

  1. 创建linux启动盘,linux系统中如何创建windows启动盘的详细介绍
  2. Vista及Win7常见故障(拷贝)
  3. 1.22 实例:商品信息查询
  4. 梁云 北大 计算机,北京大学信息技术高等研究院
  5. Adobe产品安装错误问题:Exit Code: 7
  6. CentOS 初体验十七:Nexus发布仓库和引用
  7. 跨平台与云端创新,为企业和开发者开辟更广阔的未来
  8. java base64 加解密_java Base64加解密
  9. Money 20/20 | 未来金融数字化转型:数字化半径与全栈式战略观
  10. Android使用Aspectj(AOP)
  11. iOS中书写代码规范35条小建议
  12. 性能分析工具System Trace
  13. python可以用于工业机器人编程与操作_如何实现工业机器人编程抓取
  14. 无线路由器实现网络接入
  15. SQL Server——SELECT单表数据查询(二)
  16. 利用计算机测地震是计算机的什么,地震监测计算机安装系统的制作方法
  17. 计算机考试设置背景音乐,给Excel表格添加背景音乐
  18. JavaScript实现点赞效果
  19. Json 格式化工具类 支持Jackson、FastJson、Gson
  20. c语言在规定时间内跳出循环,do while死循环如何在规定时间内跳出

热门文章

  1. 红帽linux怎么截图,Linux上使用Ksnip截图
  2. android手机存储大小设置在哪里看,安卓手机怎么设置增加虚拟内存
  3. 基于OpenCV做图像数据增强(平移、镜像、缩放、旋转、仿射)
  4. SAP上线时未清采购订单处理
  5. 2020年数学建模国赛C题Demo【准确率只有61%,仅供参考】
  6. 如何编辑简单打字游戏
  7. 语音备忘录里的录音怎么导出来
  8. 【MySQL】MVCC多版本并发控制(重点:MVCC实现原理之ReadView)
  9. mysql如何数据恢复
  10. 卸载VS时彻底删除C盘文件方法