ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2021-05-01 13:33:37  阅读:161  来源: 互联网

标签:Host Spring void 代理 host Rent AOP public


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();
    }
    }
    

在这里插入图片描述

代理模式 动态代理:
动态代理分为三大类:
基于接口----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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有