其他分享
首页 > 其他分享> > 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("满意的话,签合同!");
}
}
测试类

在这里插入图片描述

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

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

【proxy、InvocationHandler、invoke】

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

动态代理实现案例:
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();
}
}

返回结果:
在这里插入图片描述

总结:

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

动态代理的好处:

标签:Host,Spring,void,代理,host,Rent,AOP,public
来源: https://blog.csdn.net/weixin_46163590/article/details/116329445