什么是代理模式
为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
假设场景:我现在有一间房子,需要出租,这个时候我会去联系中介帮我出租房子,租客通过中介租赁我的房子。
- 我就是一个真实对象
- 中介就是一个代理对象
- 租客就是调用者
JDK动态代理
真实对象必须实现接口,否则运行时报异常
UserService.java
public interface UserService {
void addUser();
}
UserServiceImpl.java
public class UserServiceImpl implements UserService {
@Override
public void addUser() {
System.out.println("UserService addUser.....");
}
}
MyMethodInterceptor.java
public class MyMethodInterceptor implements MethodInterceptor {
//真实对象
private Object obj;
/**
* 根据真实对象获取代理对象
* @param obj 真实对象
* @return 代理对象
*/
public Object getProxy(Object obj){
this.obj = obj;
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(obj.getClass());
enhancer.setCallback(new MyMethodInterceptor());
return enhancer.create();
}
@Override
public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
System.out.println("进入代理方法逻辑。。。。。。。。。。。");
System.out.println("调用之前。。。。。。。。。。。");
Object re=methodProxy.invokeSuper(proxy,args);
System.out.println("调用之后。。。。。。。。。。。");
return re;
}
}
运行
public static void main( String[] args ){
//输出代理对象的class文件 在根目录下
System.getProperties().put("sun.misc.ProxyGenerator.saveGeneratedFiles", "true");
MyInvocationHandler myInvocationHandler=new MyInvocationHandler();
UserService proxyuserService = (UserService) myInvocationHandler.getProxy(new UserServiceImpl());
proxyuserService.addUser();
}
运行结果
Cglib动态代理
ProductService.java
public class ProductService {
public void addProduct(){
System.out.println("productService addproduct");
}
}
运行
public static void main( String[] args ){
MyMethodInterceptor myMethodInterceptor=new MyMethodInterceptor();
ProductService ps= (ProductService) myMethodInterceptor.getProxy(new ProductService());
ps.addProduct();
}