乐趣区

吃透动态代理,解密spring AOP源码(一)

首先讲讲代理模式。什么是静态代理,为什么需要动态代理?
代理模式:定义:给目标对象提供一个代理对象,并由代理对象控制对目标对象的引用。目的:1. 通过引入代理对象来间接访问目标对象,防止直接访问目标对象给系统带来的不必要复杂性;2. 通过代理对象对原有的业务增强。
如图代理模式类图:

简单看了下图解就开始上代码吧 1. 先定义一个抽象对象即公共接口类
/**
* 负责生产男性用品
*/
public interface ManToolFactory {
public void saleManTool(String size);
}

2. 真实对象
/**
* A 工厂负责生产男性用品
*/
public class AManFactory implements ManToolFactory {

@Override
public void saleManTool(String size) {
System.out.println(“A 工厂出售男性用品, 大小为 ” + size);
}

}
3. 代理对象
/**
* 静态代理类
*/
public class StaticProxy implements ManToolFactory {

// 代理的真实对象, 多个的话考虑公用 object 也就是动态代理的实现
private AManFactory aManFactory;// 类似搬运工,代理真实对象的方法

public StaticProxy(AManFactory aManFactory) {
this.aManFactory = aManFactory;
}

@Override
public void saleManTool(String size) {
dosomeThingBefore();// 前置增强
aManFactory.saleManTool(size);
dosomeThingAfter();// 后置增强
}

public void dosomeThingBefore() {
System.out.println(“ 售前服务,负责产品的调研工作 ”);
}

public void dosomeThingAfter() {
System.out.println(“ 售后服务,送门服务,三包等 ”);
}
}
由代理模式可增强原有业务。
问题来了,如今代理不仅仅帮忙代购男性用品,也要代购女性用品,那同样的我们就再定义一个接口。
/**
* 负责生产女性用品的抽象对象
*/
public interface WomanToolFactory {

public void saleWomanTool(Double length);
}
/**
* B 工厂专门负责生产男性用品(真实对象)
*/
public class BWomanFactory implements WomanToolFactory {

@Override
public void saleWomanTool(Double length) {
System.out.println(“B 工厂生产女性用品, 长度 ” + length);
}

}
此时代理类需要修改,开始思路如下

public class StaticProxy implements ManToolFactory,WomanToolFactory {

private AManFactory aManFactory;
private BWomanFactory bManFactory;
@Override
public void saleManTool(String size) {
//TODO
}
@Override
public void saleWomanTool(Double length) {
//TODO
}

那如果再多一个业务,代购点别的产品,那是不是又要再实现一个接口,这样就违背了设计模式的原则:开闭原则因此动态代理就出现了。动态代理看下节

退出移动版