应用完全启动后, 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 ...
随机推荐
- Hadoop configration类分析
configration这个类是分析hadoop源代码一个很好地入口. 先从需求说起.对于一个大型的文件系统,基于配置文件可以增强灵活性.congfigration类就是为了管理配置文件的. 配置文件 ...
- dynamic_cast,const_cast,static_cast,reinterpret_cast 详解
如果直接指针直接强转,将只能访问虚函数的内容,而不能访问特定类中的特定成员或方法!!!! 强制类型转换运算符:C++有四种强制类型转换符,分别是dynamic_cast,const_cast,stat ...
- Java [Leetcode 110]Balanced Binary Tree
题目描述: Given a binary tree, determine if it is height-balanced. For this problem, a height-balanced b ...
- erl0004 - ets 安全遍历
safe_fixtable(Tab, true|false) -> true Types: Tab = tid() | atom() 锁定set,bag和 ...
- (转)HTTP协议详解
引言 HTTP是一个属于应用层的面向对象的协议,由于其简捷.快速的方式,适用于分布式超媒体信息系统.它于1990年提出,经过几年的使用与发展,得到不断地完善和扩展.目前在WWW中使用的是HTTP/1. ...
- 查看nginx编译安装
大家是否遇到过去了新公司,公司内的LAMP,LNMP等所有的环境都是配置好的(已经在提供服务了),公司又没有留下部署文档,甚至安装LAMP,LAMP等环境的人已经和你交接完离职了,那么线上服务器(la ...
- 【打表】HDOJ-2089-不要62
[题目链接:HDOJ-2089] 多组测试数据,所以可以先算出符合条件的所有数保存数组中,输入时则直接遍历数组. #include<iostream> #include<cstrin ...
- 【转】个人常用iOS第三方库以及XCode插件介绍 -- 不错
原文网址:http://adad184.com/2015/07/08/my-favorite-libraries-and-plugins/ 第三方库是现在的程序员离不开的东西 不光是APP开发 基本上 ...
- 如何打开和关闭Oracle Flashback
1.打开flashback: 关闭数据库 SQL>shutdown immediate; 启动到mount方式 SQL>startup mount; 如果归档没有打开,打开归档[因为fla ...
- AFNetWorking 的简单使用
转:http://blog.csdn.net/marujunyy/article/details/18424711 由于ASIHTTPRequest 不再更新了,不能使用block感觉不太好用:最后选 ...