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可以配置中文过滤 拦截器实现步骤 ...
随机推荐
- 【mybatis】使用mybatis框架中踩过的坑
好久没来记录一下自己的学习情况,最近都在学框架,今天来记录一下关于mybatis框架的学习过程中碰过的一些问题: 以下内容可能稍微有点凌乱,因为是把之前遇到过的错误或异常都集中一起了,不过我已经把问题 ...
- Spring:MVC
摘要 Spring MVC 是一个开源的.基于MVC架构的WEB应用框架.这里记录MVC模型的概念以及Spring MVC 的请求处理流程. 关键词:Spring MVC 一.什么是Spring MV ...
- 深度学习项目——基于循环神经网络(RNN)的智能聊天机器人系统
基于循环神经网络(RNN)的智能聊天机器人系统 本设计研究智能聊天机器人技术,基于循环神经网络构建了一套智能聊天机器人系统,系统将由以下几个部分构成:制作问答聊天数据集.RNN神经网络搭建.seq2s ...
- Appium+python自动化获取toast消息的方法
转载地址:https://www.cnblogs.com/shangren/p/8191879.html 1. 首先执行这个命令:npm install -g cnpm --registry=http ...
- usb设备驱动的分析
怎样来分析驱动程序呢? 1.将一个usb设备插入到电脑上,在串口软件上能够显示一些打印信息,用source insight软件打开linux内核2.6.22版本,然后从第一行查找通用的关键字,找到这一 ...
- TZOJ 2703 Cow Digit Game(sg博弈)
描述 Bessie is playing a number game against Farmer John, and she wants you to help her achieve victor ...
- Error starting Tomcat context. Exception: org.springframework.beans.factory.BeanCreationException
Error starting Tomcat context. Exception: org.springframework.beans.factory.BeanCreationException. M ...
- Workerman创建聊天室实例
// 标记是全局启动 define('GLOBAL_START', 1); require_once __DIR__ . '/Workerman/Connection.php'; require_on ...
- log4j 配置日志输出(log4j.properties)
轉: https://blog.csdn.net/qq_29166327/article/details/80467593 一.入门log4j实例 1.1 下载解压log4j.jar(地址:http: ...
- 通过C#发送自定义的html格式邮件
要发送HTML格式邮件,需要设置MailMessage对象的IsBodyHtml属性,设置为true. 类MailMessage在命名空间System.Net.Mail下.using System.N ...