PS:
动态代理分为两种:
1.基于JDK的:实现InvocationHandler 中的invoke方法并指定增强器
2.基于cglib的:实现MethodInterceptor中的intercept方法并指定增强器【依赖jar包【cglib、asm】】
1.新建service接口
public interface UserService {
//用户支付功能
public void payMoney();
}
2.新建service接口的实现类
public class UserServiceImpl implements UserService {
@Override
public void payMoney() {
System.out.println("用户发起付款请求!");
}
}
3.新建代理工厂
/**
* @Name: DynamicProxy.java
* @Description: 实现InvocationHandler接口中的invoke
* @Create 2019年11月15日 上午10:42:23
*/
//【InvocationHandler】相当于一个增强器,在目标对象执行的方法之前或者之后进行增强【登录验证,添加日志等等】
public class JDKProxyFactory implements InvocationHandler {
//初始化目标对象
private Object targetObject;
//返回一个代理对象
public <T> Object getInstance(Class<T> classzz) {
try {
//指定目标对象
targetObject = classzz.newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
//获取一个代理对象
//Proxy.newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)
//参数一:【ClassLoader loader】指定目标对象需要的类加载器
//参数二:【Class<?>[] interfaces】指定目标对象实现的接口
//参数三:【InvocationHandler h】指定目标对象需要使用的增强器【this-下方的invoke方法】
Object proxyTargetObject = Proxy.newProxyInstance(
classzz.getClassLoader(), classzz.getInterfaces(), this);
return proxyTargetObject;
}
//增强器的实现【loginCheck();、addLog();】
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
// 进行登录检查
loginCheck();
// 执行目标对象的方法
Object invoke = method.invoke(targetObject, args);
// 添加日志
addLog();
return invoke;
}
// 进行登录检查
public void loginCheck() {
System.out.println("登录检查");
}
// 添加日志
public void addLog() {
System.out.println("添加日志");
}
}
4.新建测试类
public class ProxyTest {
public static void main(String[] args) {
//新建一个代理工厂
JDKProxyFactory factory = new JDKProxyFactory();
//获取代理对象
UserService userService = (UserService) factory.getInstance(UserServiceImpl.class);
//通过代理对象执行目标方法
userService.payMoney();
}
}
二、基于cglib的实现方式
public class CglibProxyFactory implements MethodInterceptor {
public <T> Object getInstance(Class<T> classzz) {
// 返回创建的代理对象
//【classzz】指定目标类
//【this】指定增强器-【下方的intercept】
return Enhancer.create(classzz, this);
}
@Override
public Object intercept(Object object, Method method, Object[] args,
MethodProxy methodProxy) throws Throwable {
// 进行登录检查
loginCheck();
//执行目标对象的方法【object】目标对象 【args】目标方法
Object invoke = methodProxy.invokeSuper(object, args);
// 添加日志
addLog();
return invoke;
}
// 进行登录检查
public void loginCheck() {
System.out.println("登录检查");
}
// 添加日志
public void addLog() {
System.out.println("添加日志");
}
}