三种代理模式
上次说了一个装饰者模式,在不修改现有类的基础上,给其中的方法增加额外的功能,比如增加日志功能,事务功能等等,通过这种模式我们认为可以实现AOP。
当然在java中 实现AOP用的却是 Proxy代理模式,在我看来,如果只有一层装饰,装饰模式和 Proxy模式是可以互换的,区别是 装饰模式可以任意的组合装饰的功能,而proxy 模式通常只是 做一层代理,动态的添加一层的额外功能。
在java中实现代理模式通常有三个类型。
最简单的是静态代理模式:
iterface userDao{
void save();
}
UserDaoImp Implement userDao{
Void save(){
dosave…
}
}
UserDaoProxy implement userDao{
User Dao target ;
Void save(){
//start 事务
target.save()
//end 事务
}
}
对于静态模式,针对每个接口都需要实写 Proxy,假设有10个 Dao 接口,如果要添加事务就需要写10个proxy,这个通常是不能接受的,所有才有 AOP模式,只要在需要加事务的地方,标识事务,就可以让java 自己添加 事务功能,这个就是动态代理。
java的动态代理,其实时对代理模式的动态生成,我们看到上面的模式时非常固定的,利用java 的反射,只要你传入一个要代理的接口 和 target 对象,就可以生存相应的 Proxy 类,也就是省去了 写10个Proxy
的重复工作。
在java 的Proxy包里实现代理模式,有一个前置条件,就是 target对象 必须要实现某个接口, 因为它内部逻辑是基于 接口创建新的类。
在有的情况下,我们可能想要代理一个类,他没有实现任何接口, Cglib 的proxy 可以实现这一点, 他使用了 子类继承的模式, 比如上述例子中,如果没有 实现userDao 接口, UserDaoProxy 可以 extends UserDaoImpl,再 重写 save 方法就可以, cglib 就是这样,你给他一个target 对象,他就动态 生成e子类, 比起java 的Proxy模式适应性更广一些,但是要引入新的 依赖包。