拦截器的原理
拦截器:interceptor Action
前置增强
request ——-> 放行 ——————————---> .....
后置增强
与Filter 过滤器很相似:
Filter就是对请求做相应的拦截
Filter:web领域的概念,只能针对请求和响应做增强,离不开servlet-api.jar
interceptor:整个java领域的概念,不仅可以运用到service层,还可以用到web层。
日志记录
代码演示
(1)LogUtil类,有一个 writeLog的方法
package com.keen.proxy.log;
import java.util.Date;
//在seivice方法调用之前,做日志记录
public class LogUtil {
public void writeLog(String className,String methodName) {
System.out.println(new Date().toLocaleString()+"调用了"+className+"类的"+methodName+"方法");
}
}
(2)LogAdvice 日志增强类(底层依然用cglib)
pckage com.keen.proxy.log;
import java.lang.reflect.Method;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;
public class LogAdvice implements MethodInterceptor{
private Object targer;//真实对象
private LogUtil logUtil;
public void setTarger(Object targer) {
this.targer = targer;
}
public void setLogUtil(LogUtil logUtil) {
this.logUtil = logUtil;
}
//创建代理对象
public <T> T getProxyObject(){
/*Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(targer.getClass());//告诉它,你要增强的哪个类
enhancer.setCallback(this);
return (T) enhancer.create();
*/
//使用另外一种更加简单的方法
return (T) Enhancer.create(targer.getClass(), this);
}
@Override
//做增强
public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodproxy) throws Throwable {
//调用日志
logUtil.writeLog(method.getDeclaringClass().getName(),method.getName());
//调用真实对象
Object ret = method.invoke(targer, args);
return ret;
}
}
测试类
@SpringJUnitConfig
public class AutoTest {
@Autowired
private LogAdvice advice;
@Test
void testSave() throws Exception {
//获取代理对象 jdk :class com.sun.proxy.$Proxy19
//cglib:class com.keen.proxy.service.IEmployeeServiceImpl$$EnhancerByCGLIB$$ec7415fa
IEmployeeServiceImpl proxy = advice.getProxyObject();
//System.out.println(proxy.getClass());
proxy.save(new Employee());
}
@Test
void testUpdate() throws Exception {
IEmployeeServiceImpl proxy = advice.getProxyObject();
//System.out.println(proxy.getClass());
proxy.update(new Employee());
}
}
网友评论