代理模式是spring AOP的底层 【SpringAOP和SpringMVC】
静态代理:
好处:可以使真实的操作更加纯粹,不用去关注一些公开的业务
公共业务也就交给代理角色,实现了业务的分工
公共业务发生扩展的时候,方便集中管理
缺点:一个真实角色会产生一个代理角色,代码会翻倍,开发效率会变低
角色分析:
抽象角色: 一般使用接口或抽象类
真实角色: 被代理的角色
代理角色: 代理真实角色,代理真实角色后,一般会做一些附属操作
客户: 访问代理对象的人
租房行为:
//租房
public interface Rent {
public void rent();
}
房东:
//房东
public class Host implements Rent{
public void rent() {
System.out.println("房东要出租房子!");
}
}
中介:
package com.YWJ.client.demo01;
public class Proxy implements Rent {
private Host host;
public Proxy(Host host) {
this.host = host;
}
public void rent() {
host.rent();
seeHouse();
}
//看房
public void seeHouse(){
System.out.println("中介带你看房");
}
}
客户:
//客户,租房子的人
public class Client {
public static void main(String[] args) {
Host host = new Host();
//代理,中介帮房东租房子,代理角色有附属操作
Proxy proxy = new Proxy(host);
proxy.rent();
}
}
动态代理:
动态代理的代理类是动态生成的,不是直接写好的。
分为:【基于接口的动态代理】,【基于类的动态代理】
基于接口:JDK动态代理【!】
//基于类: cglib
//java字节码实现:javasist
好处:
1.可以使真实的操作更加纯粹,不用去关注一些公开的业务
2.公共业务也就交给代理角色,实现了业务的分工
3.公共业务发生扩展的时候,方便集中管理
4.一个动态代理类代理的是一个接口,一般就是对应的一类业务
5.一个动态代理类可以代理多个类,只要实现同一个接口
Proxy: 生成动态代理实例
InvocationHandler: 调用处理程序并返回结果,可添加新功能
//用这个类自动生成代理类
public class ProxyInvocationHandler implements InvocationHandler {
//被代理的接口
private Object target;
public void setTarget(Object target) {
this.target = target;
}
//生成得到代理类
public Object getProxy(){
return Proxy.newProxyInstance(this.getClass().getClassLoader(),target.getClass().getInterfaces() ,this );
}
//处理代理实例,并返回结果
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//动态代理的本质,使用反射机制实现
Object result = method.invoke(target, args);
return result;
}
}