代理模式是AOP的主要实现。何为代理模式喃?举个例子,皇上洗澡,只需要进浴池洗澡就能够洗完澡了,至于洗澡前的脱衣,洗澡后的穿衣都是其他人完成的,这就可以看成皇上真实的动作只有洗澡,其他的都是被隐藏起来的被代理的动作。步入正题了,代理模式分了两种,一种是JDK动态代理,一种cglib代理(不考虑静态代理)。
public interface IUserService {
void shower();
}
public class UserService implements IUserService {
public void shower() {
System.out.println("皇上洗澡了");
}
}
1.JDK动态代理。
public class MyProxy implements InvocationHandler {
private Object object;
public MyProxy(Object object) {
this.object = object;
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("脱衣服了");
// 执行目标对象方法
//Object是原本方法返回值
Object returnValue = method.invoke(object, args);
System.out.println("穿衣服了");
return returnValue;
}
}
这就完成了代理了,接下来只需要获得代理对象了。
@Test
public void testJDK() {
IUserService userService = new UserService();
MyProxy handler = new MyProxy(userService);
//这个地方就能够看到被JDK代理的对象必须实现接口
IUserService myProxy = (IUserService) Proxy.newProxyInstance(handler.getClass().getClassLoader(),
UserService.class.getInterfaces(), handler);
myProxy.shower();
}
2.cglib代理
cglib和jdk动态代理不同,cglib是依靠字节码增强,并不需要被代理的类实现接口。那么我们就需要对UserService修改一下。
public class UserService{
public void shower() {
System.out.println("皇上洗澡了");
}
}
而为了实现cglib的话,需要利用spring提供的MethodInterceptor接口。
public class MyCglibProxy implements MethodInterceptor {
// 维护目标对象
private Object target;
public MyCglibProxy(Object target) {
this.target = target;
}
/**
* 创建代理对象
*/
public Object getProxyInstance() {
Enhancer en = new Enhancer();
// 1.设置父类
en.setSuperclass(target.getClass());
// 2.设置回调函数
en.setCallback(this);
// 3.创建子类(代理对象)
return en.create();
}
public Object intercept(Object arg0, Method method, Object[] args, MethodProxy proxy) throws Throwable {
System.out.println("脱衣服了");
// 执行目标对象的方法
Object returnValue = method.invoke(target, args);
System.out.println("穿衣服了");
return returnValue;
}
这样就形成了代理对象。测试类
@Test
public void cglib() {
// 目标对象
UserService target = new UserService();
// 代理对象
UserService proxy = (UserService) new MyCglibProxy(target).getProxyInstance();
// 执行代理对象的方法
proxy.shower();
}
以上便是两种代理方式。