- 简介
代理模式主要对我们方法执行之前与之后实现增强 - 应用场景
日志打印
RPC的远程调用框架
mybatis mapper
AOP
事务处理
自定义注解
springboot全局捕获异常
方法前后实现拦截 - 优点
减少代码冗余,提高代码复用性,安全性,隐藏真实信息,避免非法侵入 - 动态代理
不需要些代理类,统一采用程序生产
jdk动态代理:采用实现接口模式增强
实现invocationhandler接口重写invoke方式实现回调增强
生成代理类的核心思想
1. 使用java反射机制获取当前接口的信息 javase反射机制
2. 拼接java代码,将java代码写入在本地文件
3. 将java代码编译为class文件
4. 程序直接读取该class文件到内存中即可。 - 实际案例
业务接口类
package com.huahailong.proxy.service;
/***
* 业务接口类
* @author Administrator
*
*/
public interface IndexService {
String index(String name);
}
业务接口类实现
package com.huahailong.proxy.service;
/***
* 业务接口类实现
* @author Administrator
*
*/
public class IndexServiceImpl implements IndexService {
public String index(String name) {
System.out.println("index方法被执行了");
return "hello " + name;
}
}
业务代理类
package com.huahailong.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/***
* 业务代理类
*
* @author Administrator
*
*/
public class IndexServiceProxy implements InvocationHandler {
private Object target;
public IndexServiceProxy(Object target) {
this.target = target;
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// 代理方法执行前
System.out.println("代理方法执行前");
Object result = method.invoke(target, args);
System.out.println("代理方法执行后");
return result;
}
/**
* 获取被代理接口实例对象
*
* @param <T>
* @return
*/
public <T> T getProxy() {
return (T) Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
}
}
测试
package com.huahailong;
import com.huahailong.proxy.IndexServiceProxy;
import com.huahailong.proxy.service.IndexService;
import com.huahailong.proxy.service.IndexServiceImpl;
public class IndexTest {
public static void main(String[] args) {
IndexService indexService= new IndexServiceProxy(new IndexServiceImpl()).getProxy();
indexService.index("詹姆斯");
}
}
结果