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可以配置中文过滤 拦截器实现步骤 ...
随机推荐
- [Solution] 985. Sum of Even Numbers After Queries
Difficulty: Easy Question We have an array A of integers, and an array queries of queries. For the i ...
- FOB注意事项
1. FOB是我们作为贸易公司去联系物流公司将货送到码头,缴纳FOB cost 以后,海关安排码头的人送到船上. 2.在这之前,买方自己订船,然后发给卖方入货通知,卖方安排发货. 3.FOB cost ...
- Openssl asn1parse命令
一.简介 asn1parse命令是一种用来诊断ASN.1结构的工具,也能用于从ASN1.1数据中提取数据 二.语法 openssl asn1parse [-inform PEM|DER] [-in f ...
- linux 学习之路:ls命令使用
1.命令格式: Ls 显示指定工作目录下的目录内容 语法:ls [-alrtAFR] [name...] 2.命令参数: 3.命令功能: 显示列出目前工作目录所含之文件及子目录 4.命令范例: 列出根 ...
- 云计算底层技术-虚拟网络设备(Bridge,VLAN)( 转发)
云计算底层技术-虚拟网络设备(Bridge,VLAN) Posted on September 24, 2017 by opengers in openstack openstack底层技术-各种虚拟 ...
- [转]JSOUP 抓取HTTPS/HTTP网页,校验问题
针对一般的http请求是不需要的校验的.但是https安全校验过总过不去.最后找到以下方法,终于成功. 让我们的站点信任所有站点,不需要引包,系统自带ssl证书校验,话不多数,贴代码. /** * 信 ...
- 一、PyQt5基础概念与安装配置
一.初识PyQt5 对于桌面程序开发,用户图形界面(GUI)的设计非常重要.一款美观.易用的用户界面可以很大程度上提高对使用这的友好度.由于Python最初是作为脚本语言开发,并没有GUI功能.但Py ...
- keepalived高可用简介与配置
keepalived简介 keepalived介绍 Keepalived 软件起初是专为LVS负载均衡软件设计的,用来管理并监控LVS集群系统中各个服务节点的状态,后来又加入了可以实现高可用的VRRP ...
- 最简单的struts应用
博客园 1.搭建一个简单的Struts2应用 具体为一下几个步骤: 1.引入Struts 2工程所需运行库文件. 2.创建并配置web.xml文件 3.创建一个Action类 4.创建并配置strut ...
- pl/sql调试存储过程
1.找到对应的存储过程 2.在存储过程名称上右键,选择Test 3.点击1标识的按钮(begin debugger),选择2开始调试 4.存储过程如需参数,需要在右侧下方的表格区域(3)填入对应的值即 ...