◎筱米加步枪◎.Blog

Happy coding

代理模式-动态代理

最近项目中一直在配置Spring AOP,听说AOP是基于动态代理模式实现的,于是乎就去学习了动态代理,虽然还是迷迷糊糊,不过还是将自己的学习成功总结下。

自己写了个例子来说明:(部分说明写在代码中)

//汽车类
public  class Car {
	
	//牌子
	private String brand;
	
	public Car(String brand){
		this.brand = brand;
	}
	
	//获取汽车的描述
	public  String getDescribe(){
		return brand+"车";
	}
}
//奥迪车
public class AudiCar extends Car{
	
	public AudiCar(){
		super("奥迪");
	}
}
//奔驰车
public class BenzCar extends Car {
	
	public BenzCar(){
		super("奔驰");
	}
}
//汽车代理接口
public interface CarProxy {
	
	public void sellCar(Car car);
}
//汽车代理实现类
public class CarProxyImpl implements CarProxy {

	@Override
	public void sellCar(Car car){
		System.out.println("卖出一辆"+car.getDescribe());
	}
}
//动态代理对象(调用处理器)-可代理任何的代理对象
//这个类是被java.lang.reflect.Proxy所调用
public class DynamicProxy implements InvocationHandler{
	
	//代理对象
	private Object proxyObject;
	
	public DynamicProxy(Object proxyObject){
		this.proxyObject = proxyObject;
	}
	
	@Override
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		//方法执行前做事 Spring AOP 切面的原理 ,对方法method进行横切
		//在真正执行方法之前或者之后做一些额外的操作
		//就这就Spring AOP实现横向切面的原理了
		System.out.println("打算执行方法");
		Object object = method.invoke(proxyObject, args);
		//方法执行之后做的事,Spring AOP 切面的原理
		System.out.println("方法执行之后");
		return object;
	}
}
//代理工厂
public class ProxyFactory {

	// 创建一个代理
	public static Object createProxy(Object proxyObject) { // 被代理的对象
		Class<? extends Object> clazz = proxyObject.getClass();
		Object proxy = Proxy.newProxyInstance(clazz.getClassLoader(), clazz
				.getInterfaces(), new DynamicProxy(proxyObject));
		return proxy;
	}
}
//测试类
public class Test {
	
	public static void main(String[] args) {
		//通过代理工厂创建一个汽车代理
		CarProxy carProxy = (CarProxy) ProxyFactory
				.createProxy(new CarProxyImpl());
		carProxy.sellCar(new AudiCar());
		carProxy.sellCar(new BenzCar());
	}
}
打算执行方法
卖出一辆奥迪车
方法执行之后
打算执行方法
卖出一辆奔驰车
方法执行之后

动态代理的好处就是可以代理任意的代理对象,都可以通过代理工厂中指定代理对象即可。

另外就是可对执行方法加入一些额外操作,就是AOP了,只是Spring把这些都通过配置来实现。