Spring 静态代理与 动态代理 【在理解为学习AOP奠定基础】(七)

Spring AOP 代理模式学习

  • 场景:你在找房子业务
    Spring   静态代理与 动态代理 【在理解为学习AOP奠定基础】(七)

什么是代理?

代理是通知目标对象后创建的对象。从客户端的角度看,代理对象和目标对象是一样的。

代理模式 静态代理:
出租房屋

public interface Rent {
@SuppressWarnings(“ALL”)
void Renthouse();
}

房东类
public class Host implements Rent {
@Override
@SuppressWarnings("ALL")
public void Renthouse() {
	System.out.println("房东有一套房子出租!!!");
}
}

package Com.bigDataWork_Proxy02;

代理类
public class Proxy implements Rent{
private Host host;

public Proxy() {
}

public Proxy(Host host) {
	this.host = host;
}
@Override
@SuppressWarnings("All")
public void Renthouse() {
	host.Renthouse();
	Money();
	seeHose();
	hetong();
}
// 看房子
public void seeHose(){
	System.out.println("中介-带我看房子.");
}
// 收取中介费
public void Money(){
	System.out.println("中介-收取一定的报酬会");
}
/**
 * 在加一个业务: 签合同的业务!!
 */
public void hetong(){
	System.out.println("满意的话,签合同!");
}
}
测试类
  • 你自己 - 有需求需要租一套房子,但是你自己找不到
  • 房子,于是产生了中间也就是Proxy 类。

    public class client {
    public static void main(String[] args) {
    	//房东类
    	Host host = new Host();
    	//代理类
    		Proxy proxy = new Proxy(host);
    	//代理租房子类
    	proxy.Renthouse();
    }
    }
    

Spring   静态代理与 动态代理 【在理解为学习AOP奠定基础】(七)

代理模式 动态代理:
动态代理分为三大类:
基于接口----jdk动态代理
基于类-----cglib动态代理
Java字节码实现:javasist

在开始学习动态代理之前,需要理解以下类的含义:

【proxy、InvocationHandler、invoke】

Spring   静态代理与 动态代理 【在理解为学习AOP奠定基础】(七)

Spring   静态代理与 动态代理 【在理解为学习AOP奠定基础】(七)
Spring   静态代理与 动态代理 【在理解为学习AOP奠定基础】(七)

动态代理实现案例:
package Com.bigDataWork_Proxy03;
//真实角色
public interface Rent {
@SuppressWarnings("all")
  void Rent();
}
	//实现房东类进行具体的业务
package Com.bigDataWork_Proxy03;
public class Host implements Rent{
@Override
public void Rent() {
	System.out.println("房东有一整套房子出租!!");
}
}

// 真实的动态代理类:处理需要代理的对象

public class ProxyInvocationHandler implements InvocationHandler {
//被代理的接口
private Rent rent;
public void setRent(Rent rent){
	this.rent=rent;
}

// 生成得到代理类
public Object getProxy(){
 return	Proxy.newProxyInstance(this.getClass().getClassLoader(),rent.getClass().getInterfaces(),this);
}

//处理代理实例,返回得到结果!!
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
	Object result = method.invoke(rent,args);
	return result;
}
}

// 测试类

public class client {
public static void main(String[] args) {
//真实角色
Host host = new Host();
// 创建的代理角色:
ProxyInvocationHandler pih = new ProxyInvocationHandler();
pih.setRent(host);
Rent proxy = (Rent) pih.getProxy();
proxy.Rent();
}
}

返回结果:
Spring   静态代理与 动态代理 【在理解为学习AOP奠定基础】(七)

总结:

方法包所在位置:
java.lang.reflect.InvocationHandler;
java.lang.reflect.Method;
java.lang.reflect.Proxy;

动态代理的好处:
  • 可以使真实角色的操作更加纯粹! 不去关注一些公共的业务
  • 公共部分交给代理角色!实现了业务的分工。
  • 公共部分发生扩展的部分(也是就是业务增加扩展功能的时候) 方便集中管理!
  • 一个动态代理类代理的是一个接口, 一般就是对应的一类业务
  • 一个动态代理类可以代理多个类,只要实现了一个接口即可!
上一篇:代理模式总结


下一篇:代理模式和spring的AOP