JAVA代理,静态,动态详解

JAVA代理,静态,动态详解
文章图片

目录
代理
静态代理
动态代理
JDK动态代理
CGLib动态代理
总结
代理
为其他对象提供一种代理以控制这个对象的访问,在某些情况下一个对象不能直接访问那个对象时,代理就起到了客户端和被代理对象 (委托类) 中介作用 。
按照代理的创建时期,代理类可以分为两种:
静态:由程序员创建代理类或特定工具自动生成源代码再对其编译 。在程序运行前代理类的.class文件就已经存在了 。
动态:在程序运行时运用反射机制动态创建而成 。
静态代理
ubject: 代理类和被代理类实现同样的接口
roxy:代理类,里面有被代理类,具体逻辑委托被代理类进行处理
RealSubject:被代理类,可以在其内做一些访问权限控制,额外的业务处理
Client:看到的是代理类,并不知道具体处理业务逻辑的类,降低耦合性
代码实现
UserDAO 代理和被代理的公共的接口(Subject)
ublic interface ProxyDao {
oolean insert(String name);
}
UserDAOImpl 被代理类(RealSubject)
ublic class ProxyDaoImpl implements ProxyDao {
[email protected]
ublic boolean insert(String name) {
ystem.out.println("insert name=" + name);
return true;
}
}
roxyByInterface 代理类,通过实现接口方式实现代理方式(Proxy)
ublic class ProxyByInterface implements ProxyDao {
rivate ProxyDao proxyDao;
ublic ProxyByInterface(ProxyDao proxyDao) {
this.proxyDao = proxyDao;
}
[email protected]
ublic boolean insert(String name) {
ystem.out.println("before insert by interface");
return proxyDao.insert(name);
}
}
roxyByExtend 代理类,通过继承被代理类实现的代理方式(Proxy)
ublic class ProxyByExtend extends ProxyDaoImpl{
rivate ProxyDaoImpl proxyDao;
ublic ProxyByExtend(ProxyDaoImpl proxyDao) {
this.proxyDao = proxyDao;
}
[email protected]
ublic boolean insert(String name) {
ystem.out.println("before insert by extend");
return proxyDao.insert(name);
}
}
获取代理对象客户端(Client)
ublic class Client {
ublic static void main(String[] args) {
roxyDaoImpl proxyDao = new ProxyDaoImpl();
//和被代理类实现同个接口方式进行代理
roxyByInterface proxyByInterface = new ProxyByInterface(proxyDao);
roxyByInterface.insert("zc-Interface");
//通过继承被代理类方式进行代理
roxyByExtend proxyByExtend = new ProxyByExtend(proxyDao);
roxyByExtend.insert("zc-Extend");
}
}
好处:
可以不用动原来类的逻辑,再次增加一些功能,符合开闭原则 。
真正的业务还是交给被代理对象处理的,无须修改原来的类就可以使用代理进行实现 。