2.Spring 拦截器应用
首先咱们来了解一下具体的业务场景(这个跟第一篇中的很相似但有不同):具体的业务是这样的,现在系统中有六十多个主档(功能模块),每个主档都有新增、修改、删除功能,当我们在对每个主档做这些操作时需要对其记录日志,需要注意的是,修改的时候不对数据库中的数据做任何修改,所以这里就用到了拦截器(当然也可以使用hibernate监听,而且应该会简单点,有兴趣的同志可以试一下),对修改方法进行拦截同时拿到修改方法的参数,代码如下(这里只写Spring bean配置和bean实现类,具体的业务bean就是serviceImpl里面的add、update、delete):
<?xml version="1.0" encoding="utf-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> <bean id="masterFileService" abstract="true" class="com.yueya.oms.lmd.CommitLog.impl.CommitLogFactoryBean">
</bean>
<bean id="myStoreTypeCodeService" class="com.yueya.oms.lmd.StoreTypeCode.impl.StoreTypeCodeServiceImpl"/>
<bean id="storeTypeCodeService" parent="masterFileService">
<!--代理接口-->
<property name="serviceInterface" value="com.yueya.oms.lmd.StoreTypeCode.StoreTypeCodeService"/>
<!--目标实现类-->
<property name="serviceImpl" ref="myStoreTypeCodeService"/>
<!--目标对象执行方法-->
<property name="methodName" value="updateStoreTypeCode"/>
</bean> .... </beans>
FactoryBean的实现
public class CommitLogFactoryBean<T> implements FactoryBean<T>, InitializingBean, MethodInterceptor {
private Object proxy;//代理对象
private Class<Object> serviceInterface;//代理接口
private Object serviceImpl;//目标实现类
private String methodName;//目标对象执行方法
private ClassLoader classLoader = ClassUtils.getDefaultClassLoader();
public CommitLogFactoryBean() {
}
public Object getProxy() {
return proxy;
}
public void setProxy(Object proxy) {
this.proxy = proxy;
}
public Class<Object> getServiceInterface() {
return serviceInterface;
}
public void setServiceInterface(Class<Object> serviceInterface) {
this.serviceInterface = serviceInterface;
}
public Object getServiceImpl() {
return serviceImpl;
}
public void setServiceImpl(Object serviceImpl) {
this.serviceImpl = serviceImpl;
}
public String getMethodName() {
return methodName;
}
public void setMethodName(String methodName) {
this.methodName = methodName;
}
@Override
public T getObject() throws Exception {
return (T) this.proxy;
}
@Override
public Class<?> getObjectType() {
return this.serviceInterface;
}
@Override
public boolean isSingleton() {
return false;
}
public void afterPropertiesSet() throws Exception {
this.proxy = (new ProxyFactory(this.serviceInterface, this)).getProxy(this.classLoader);
}
/**
* 当主档做修改操作时将修改方法拦截且不对数据库执行任何操作,同时将拦截的数据记入CommitLog中,
* 若是新增和删除则在对数据库执行完新增和删除操作后将新增和删除的数据记入CommitLog中
*
* @param invocation
* @return
* @throws Throwable
*/
public Object invoke(MethodInvocation invocation) throws Throwable {
try {
Method method = invocation.getMethod();
String methodName = method.getName();
Object result = null;
Object[] objects = invocation.getArguments();
if (methodName.startsWith("add") || methodName.startsWith("delete")) {//新增或删除
result = $invoke(serviceImpl, method, objects);
RecordContext.getInstance().take(objects[0], methodName, result);
} else if (methodName.equals(this.methodName)) {//修改
RecordContext.getInstance().take(objects[0], methodName, "");
} else if (methodName.equals("toString")) {//调试时使用
return this.serviceImpl.toString();
} else {//查询
result = $invoke(serviceImpl, method, objects);
}
return result;
} catch (Throwable t) {
t.printStackTrace();
throw t;
}
}
private Object $invoke(Object target, Method method, Object[] args) throws InvocationTargetException, IllegalAccessException {
return method.invoke(target, args);
}
}
切记,在这里要手动调用invoke()方法执行目标方法,否则无法执行,具体原因我也不太清楚,有兴趣的同志可以研究研究,顺便教我下。
2.Spring 拦截器应用的更多相关文章
- Spring拦截器中通过request获取到该请求对应Controller中的method对象
背景:项目使用Spring 3.1.0.RELEASE,从dao到Controller层全部是基于注解配置.我的需求是想在自定义的Spring拦截器中通过request获取到该请求对应于Control ...
- spring拦截器中修改响应消息头
问题描述 前后端分离的项目,前端使用Vue,后端使用Spring MVC. 显然,需要解决浏览器跨域访问数据限制的问题,在此使用CROS协议解决. 由于该项目我在中期加入的,主要负责集成shiro框架 ...
- Spring 拦截器实现+后台原理(HandlerInterceptor)
过滤器跟拦截器的区别 spring mvc的拦截器是只拦截controller而不拦截jsp,html 页面文件的.这就用到过滤器filter了,filter是在servlet前执行的,你也可以理解成 ...
- Spring拦截器和过滤器
什么是拦截器 拦截器(Interceptor): 用于在某个方法被访问之前进行拦截,然后在方法执行之前或之后加入某些操作,其实就是AOP的一种实现策略.它通过动态拦截Action调用的对象,允许开发者 ...
- Spring 拦截器——HandlerInterceptor
采用Spring拦截器的方式进行业务处理.HandlerInterceptor拦截器常见的用途有: 1.日志记录:记录请求信息的日志,以便进行信息监控.信息统计.计算PV(Page View)等. 2 ...
- spring 拦截器简介
spring 拦截器简介 常见应用场景 1.日志记录:记录请求信息的日志,以便进行信息监控.信息统计.计算PV(Page View)等.2.权限检查:如登录检测,进入处理器检测检测是否登录,如果没有直 ...
- Spring 拦截器配置
Spring interceptor拦截器配置 Spring mvc的拦截器是通过handlerinterceptor来实现的 实现方式: 1.自定义一个类实现Spring的handlerinterc ...
- spring拦截器的定义
(一).拦截器的定义 1.为什么需要拦截器:在做身份认证或者是进行日志的记录时,我们需要通过拦截器达到我们的目的 2.什么事拦截器:在AOP(Aspect-Oriented Programming)中 ...
- Spring 拦截器实现事物
Spring+Hibernate的实质:就是把Hibernate用到的数据源Datasource,Hibernate的SessionFactory实例,事务管理器HibernateTransactio ...
- Spring拦截器总结
本文是对慕课网上"搞定SSM开发"路径的系列课程的总结,详细的项目文档和课程总结放在github上了.点击查看 Spring过滤器WebFilter可以配置中文过滤 拦截器实现步骤 ...
随机推荐
- NET(C#):关于正确读取中文编码文件
https://blog.csdn.net/ma_jiang/article/details/53213442 首先如果读者对编码或者BOM还不熟悉的话,推荐先读这篇文章:.NET(C#):字符编码( ...
- C++ map 使用erase在windows下崩溃,在linux下没有问题的原因
注意:此程序在win环境下会出现上述描述的问题:在mac环境下第一种方式是正常运行的.Map.erase有3个重载函数: void erase(iterator position); size_typ ...
- Vue数据交互
注意:本地json文件必须放在static目录下面,读取或交互数据前,请先安装vue-resource.点击前往 -->(vue-resource中文文档) 一.Vue读取本地JSON数据 c ...
- java中LIst转换成Json
List转换成json串 public String getNameListByID(Long Id) { List<Name> nameLists= nameService.select ...
- Mybatis 接口代理的实现(BeanDefinitionRegistryPostProcessor+FactoryBean)
相信在开发中,尤其是mybatis 配置操作中,我们只需要提供一个mapper 接口,然后注入到service 中,就可以进行调用. 按我们的一般逻辑来说,我们并没有进行接口的实现,应该会报空指针异常 ...
- SpringBoot集成MongoDB
前言 之前写了各种nosql数据库的比较,以及相关理论,现在我在本地以springboot+MongoDB框架,探究了具体的运行流程,下面总结一下,分享给大家. 运行前准备 安装并启动MongoDB应 ...
- abap 常用TCODE
ABAP: 通过查询表TSTC或者TSTCT:SAP系统将所有的事务代码都存储在这个表中,包括字开发的Y*和Z* TCODE 事务代码功能描述 CG3Y 下载服务器上文件 CG3Z upload fi ...
- hbase-读操作
(学习笔记) client和regionServer连接,通过rowkey查找对应的region 多个列簇生成多个storeScaner 每个storeScaner生成一个MemstoreScanne ...
- 有关在Eclipse中安装STS(Spring Tool Suite)的若干问题总结
1.之前说明 在网上找了很多安装的方法,每次在线安装总会出现各种各样的问题,本地安装也是出现同样的问题(后来发现是下载的包有问题) 还有其他问题(忘记截图了,上图来自网络),大概就是这些各种各样的错误 ...
- docker使用代理(测试docker 17.06)
环境:debian9 service docker stop sudo HTTP_PROXY=http://127.0.0.1:1080 dockerd sudo docker pull gcr.io ...