应用完全启动后, Spring执行自定义初始化
项目中做敏感词过滤,
因为前台ajax校验要走service ,而后台统一过滤器要走interceptor , 所以把检查器提到一个工具类(HeXieWordFinder)里
这个工具类理应缓存数据库中所有敏感词数据的list
可是直接初始化静态变量的话 spring会报出nullPointer (因为容器首先初始化个各类(static) 而后才是依赖注入)
研究了一下初始化过程 ,才想出在spring完全启动之后 这个时间点上手动初始化的办法
1.监听器
/**
* spring初始化结束后,执行onApplicationEvent方法
* 此处初始化避免了初始化static时 bean还没注入的问题
* @author tao
*/
public class InstantiationTracingBeanPostProcessor implements ApplicationListener<ContextRefreshedEvent>
{
@Override
public void onApplicationEvent(ContextRefreshedEvent event)
{
if(event.getApplicationContext().getParent() == null)//root applicationContext没有parent,保证是统一的context
{
//需要执行的逻辑代码,当spring容器初始化完成后就会执行该方法。
HeXieWordFinder h = new HeXieWordFinder();
h.initWords(heXieWordService);
}
} @Autowired
private HeXieWordService heXieWordService;//这里注入不会有生存周期的问题
}
2.spring的xml里配个bean
<bean class="com.tdt.listener.InstantiationTracingBeanPostProcessor"/>
3.查找器(缓存list)
/**
* 敏感词查找器
* @author tao
*/
@Component
public class HeXieWordFinder
{
private static List<String> SensitiveWords = new ArrayList<String>();//禁用词 public HeXieWordFinder()
{
super();
}
/*
private static HeXieWordFinder singletonInstance;//单例
public static synchronized HeXieWordFinder getInstance()//线程安全
{
if (singletonInstance == null)
{
singletonInstance = new HeXieWordFinder();
}
return singletonInstance;
}
*/
public void initWords(HeXieWordService heXieWordService)
{
synchronized(SensitiveWords)
{
//此处如果用@Autowired注入报nullPointer ,因为容器首先初始化个各类(static) 而后才是依赖注入
List<HeXieWord> wordList = heXieWordService.getAllHeXieWord();
if( null != wordList )
{
for(int i=0,len=wordList.size();i<len;i++)
{
SensitiveWords.add(wordList.get(i).getWord());
}
}
}
} public static boolean find(String value)//static
{
boolean res = false;
if( null==value || 0==value.length())
{
return res;
} for(String regex : SensitiveWords)
{
Pattern p = Pattern.compile(regex);//正则表达式判断用户输入的内容是否存在
Matcher m = p.matcher(value);
if(m.find())
{
res = true;
return res;
}
} return res;
} }
应用完全启动后, Spring执行自定义初始化的更多相关文章
- springboot 学习之路 9 (项目启动后就执行特定方法)
目录:[持续更新.....] spring 部分常用注解 spring boot 学习之路1(简单入门) spring boot 学习之路2(注解介绍) spring boot 学习之路3( 集成my ...
- spring启动后立即执行方法
1.方法所属的类继承InitializingBean接口. 2.重写afterPropertiesSet()方法. afterPropertiesSet方法会在bean被初始化时执行. 当bean的作 ...
- 【Spring Boot】Spring Boot之五种容器启动后进行相关应用初始化操作方法
一.方式一,使用ApplicationListener<E extends ApplicationEvent>监听ContextRefreshedEvent事件 /** * @author ...
- c# 窗体启动后自动执行 Form_Load事件注册及调用
很多时候我们需要在程序一开始后立即触发执行一些程序.这时候需要调用Form_Load. 首先编写事件程序块,编写完后即可再里面添加需要执行的代码. 在结构体之后写就行.添加之前的代码如下: using ...
- dosbox让DOSBox启动后自动执行命令——自动挂载
学习汇编时. 每次启动DOSBox后,都要挂载.转盘符,于是有一个骚套路. 找到这个:bat文件 用记事本就可以编辑. 拉到最下面,找到[autoexec]部分,补充命令如下: mount c f: ...
- springboot项目启动并立即执行自定义程序内容
第一种:实现ApplicationRunner接口,重写其中的run()方法: 第二种:实现CommandLineRunner接口,重写其中的run()方法: 还有第三种...
- 【Spring容器】项目启动后初始化数据的两种实践方案
早期业务紧急,没有过多的在意项目的运行效率,现在回过头看走查代码,发现后端项目(Spring MVC+MyBatis)在启动过程中多次解析mybatis的xml配置文件及初始化数据,对开发阶段开发人员 ...
- spring基础---->spring自定义初始化(一)
这里我们简单的实现一下spring中的初始化bean,以大概了解他的流程.受委屈几乎是一个人成长最快的途径,吃下去的是委屈,消化掉后得到的是格局. spring的自定义初始化 测试的项目结构如下: 一 ...
- 如何在Spring Boot应用启动之后立刻执行一段逻辑
1. 前言 不知道你有没有接到这种需求,项目启动后立马执行一些逻辑.比如简单的缓存预热,或者上线后的广播之类等等.如果你使用 Spring Boot 框架的话就可以借助其提供的接口CommandLin ...
随机推荐
- 编译pure-ftpd时提示错误Your MySQL client libraries aren't properly installed
如果出现类似configure: error: Your MySQL client libraries aren’t properly installed 的错误,请将mysql目录下的 includ ...
- 深入学习Oracle分区表及分区索引
关于分区表和分区索引(About Partitioned Tables and Indexes)对于10gR2而言,基本上可以分成几类: • Range(范围)分区 • Has ...
- Java基础——I/O
文本I/O与二进制I/O 在计算机中所有的文件都是以二进制的形式来存储的,所以本质上所有的文件都是二进制文件. 文本I/O建立在二进制I/O的基础之上,它能提供字符层次的编码和解码的抽象,在写入一个字 ...
- 【转】开始iOS 7中自动布局教程(一)
原文网址:http://www.cocoachina.com/industry/20131203/7462.html 原文:Beginning Auto Layout Tutorial in iOS ...
- 完全参照系统自带的DatePickerDialog、TimePickerDialog的源代码仿写的DateTimePickerDialog
完全参照系统自带的DatePickerDialog.TimePickerDialog的源代码仿写的DateTimePickerDialog.具有同时选择日期.时间的功能.在2.2.2.3平台,显示的效 ...
- C#中常用的字符串加密,解密方法封装,包含只加密,不解密的方法
//方法一//须添加对System.Web的引用//using System.Web.Security;/// <summary>/// SHA1加密字符串/// </summary ...
- ndk文件操作问题及小结
最近在做文件传输,发现在android下用f系列的C库函数去读取文件文件大小会受到2G大小的约束,查阅了很久,最后只能去看google的libc源码,发现了以下几个问题: 1.bionic的libc是 ...
- 【和我一起学python吧】初学Python,版本如何选择?
早在四年多以前,在我进入英才网之前,去面试过一家海归创业的公司.他们需要的是有unix开发经验的技术人员,但是因为他们当时所处的阶段对很多成熟 技术人员不是很吸引,所以条件放宽为熟悉面向对象的程序开发 ...
- Python闭包与javascript闭包比较
实例一 python def line_conf(): def line(x): return 2*x+1 print(line(5)) # within the scope line_con ...
- JDBC学习笔记(4)——PreparedStatement的使用
PreparedStatement public interface PreparedStatement extends Statement;可以看到PreparedStatement是Stateme ...