最近在做SSH集成Compass的时候可以在实体保存的时候自动将实体添加到索引文件 觉得非常的爽,但网上说Compass已经多年不更新了, 不再对lucene3.0以上的版本进行支持 且Compass效率比lucene效率差25%(有人做了测试) 所以心里很失落啊!所以转而研究lucene!
搜索了一下网上关于SSH集成lucene的例子 没有关于保存实体同时对添加实体到索引文件中去的例子,后来自己用Spring的后置通知实验了一下 完成了自动完成索引保存 与网友分享一下。
说明:我的lucene工具类是从开源社区下载的(LuceneIndexUtils.java 所有需要索引的类都要实现 SearchEnabled.java 这个接口 开源社区可以下载)
我的Spring AOP配置如下:
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import cn.itcast.util.LuceneIndexUtils;
import cn.itcast.util.SearchEnabled;
@Aspect
public class ObjectAop {
//拦截cn.itcast.service.impl包(这个包下的类都是对数据库操作的类如save、delete、update)下面的所有返回值为void的类
@Pointcut("execution(void cn.itcast.service.impl..*.*(..))")
private void anyMethod() {}
//执行后置通知的方法要求参数名称是entity
@AfterReturning(pointcut = "anyMethod()&&args(entity)")
public void doAfterReturning(JoinPoint point,SearchEnabled entity) throws Exception {
//如果是SearchEnabled的实例 就进行索引的添加 当然也可进行删除修改
//拦截到执行的方法 String methodName = point.getSignature().getName();
//通过这种拦截限制 拦截到的肯定是add save update
Method method = LuceneIndexUtils.class.getMethod(methodName, new Class[]{SearchEnabled.class});
//执行LuceneIndexUtils的add、save、update 方法
method.invoke(null, entity);
//也可以通过下面的方式执行 point.getArgs() 获取到拦截方法的参数 是个Object数组;
//method.invoke(null, point.getArgs());
①//throw new RuntimeException();
}
}
由于Spring的事务传播属性 可以保证保存实体和建立索引都是在一个事务中进行的 如果将①处注释去掉 就可以验证 所以不用担心保存实体不成功 添加索引失败事务不会滚问题