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可以配置中文过滤 拦截器实现步骤 ...
随机推荐
- PhoenixFD插件流体模拟——UI布局【Output】详解
Liquid Output 流体输出 本文主要讲解Output折叠栏中的内容.原文地址:https://docs.chaosgroup.com/display/PHX3MAX/Liquid+Outp ...
- windows10安装JIRA
windows10安装MySQL数据库 一.问题现象: cmd执行“mysql”命令,提示:ERROR 2003 (HY000): Can't connect to MySQL server on ' ...
- netty(八) netty中自带channelhandler
SslHandler:负责对请求进行加密和解密,是放在ChannelPipeline中的第一个ChannelHandler HttpClientCodec和HttpServerCodec:HttpCl ...
- c++学习路线连接
https://blog.csdn.net/qq_36482772/article/category/7396881/4?
- 远程过程调用(RPC)
在第二篇教程中我们介绍了如何使用工作队列(work queue)在多个工作者(woker)中间分发耗时的任务. 可是如果我们需要将一个函数运行在远程计算机上并且等待从那儿获取结果时,该怎么办呢?这就是 ...
- 部署NETCORE在LINUX上报Error -99 EADDRNOTAVAIL address not available
Unable to bind to http://localhost:80 on the IPv6 loopback interface: 'Error -99 EADDRNOTAVAIL addre ...
- Spring+Quartz集群环境下定时调度的解决方案
集群环境可能出现的问题 在上一篇博客我们介绍了如何在自己的项目中从无到有的添加了Quartz定时调度引擎,其实就是一个Quartz 和Spring的整合过程,很容易实现,但是我们现在企业中项目通常都是 ...
- CentOS7.2 1511部署RabbitMQ
一.安装RabbitMQ依赖的的Erlang最小支持包(当然也可以安装完整的Erlang) 1.下载RabbitMQ的Erlang最小支持包源文件 git clone https://github.c ...
- js实现一个简单的登录页面
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- 第二阶段第八次spring会议
昨天我对软件进行了植物网站的添加. 今天我将对软件进行宠物信息的添加. 清屏功能 private void button5_Click(object sender, EventArgs e) { te ...