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