【Java】Java代理
目录
1. 引入
2. 代理
2.1 代理的目的:
2.2 代理的两种模式
1. 静态代理
$$1 定义:
$$2 组成
$$3 实现步骤:
$$4 IDEA实现:
2. 动态代理
$$1 定义:
$$2 组成
$$3 实现步骤:
$$4 IDEA实现:
1. 引入
访问不到的东西交给别人去访问。
转账:
A--->B转账
这样一来,核心资源冗余。
在代理类中做风险隔离
2. 代理
2.1 代理的目的:
1.功能增强
在不修改真实对象的情况下增加额外功能。比如权限验证、事务管理等。
可以实现延迟加载,缓存优化等策略提升系统性能和资源利用率。
2.控制访问
限制对真实对象的直接访问,确保只有合适的用户或操作能够调用真实对象的方法,增强系统的安全性和可靠性,降低客户端和实际服务对象的耦合度。
2.2 代理的两种模式
CGLIB核心是继承,只有动态代理--->Mybatis
JDK核心是接口,有静态代理,也有动态代理
1. 静态代理
静态代理核心:
目标类,就有目标对象
代理
由代理类控制着对目标对象的生成。
$$1 定义:
静态代理是一种设计模式,通过创建一个代理类来实现对目标对象的代理。代理类和目标类实现相同的接口,通过代理类来间接调用目标类的方法,从而实现功能的扩展。
$$2 组成
- 接口(Interface):定义了代理类和目标类需要实现的方法。
- 目标类(Target Class):实现了接口的具体业务类。
- 代理类(Proxy Class):实现了接口,并在内部持有目标类的实例,通过调用目标类的方法来实现代理功能。
$$3 实现步骤:
- 定义接口。
- 实现目标类。
- 创建代理类。
- 使用代理类。
$$4 IDEA实现:
定义接口:
public interface ZZ {
public void zz(String A,String B,Double money);
}
实现目标类:
public class ZFB implements ZZ{
@Override
public void zz(String A, String B, Double money) {
System.out.println("用户"+A+"给用户"+B+"转了"+money+"元");
}
}
创建代理类:
public class APP implements ZZ{
private ZFB zfb=new ZFB();
@Override
public void zz(String A, String B, Double money) {
System.out.println("风险隔离");
zfb.zz(A,B,money);
}
}
使用代理类:
APP app=new APP();
app.zz("张三","李四",100.0);
内存图:
2. 动态代理
静态代理易实现。
使用多态。
$$1 定义:
动态代理是在运行时动态生成代理类的实现。动态代理不需要事先知道目标类的具体实现,而是通过反射机制在运行时动态生成代理类。
$$2 组成
- 动态代理类:在运行时动态生成,实现了被代理接口,并将方法调用转发给实际的被代理对象。
- InvocationHandler接口:动态代理的核心接口,定义了代理类需要实现的方法,用于在代理对象的方法被调用时执行一些额外的逻辑。
$$3 实现步骤:
- 定义需要代理的接口。
- 实现InvocationHandler接口,在invoke方法中实现对目标方法的增强或修改。
- 使用Proxy类的newProxyInstance方法动态创建代理对象。
- 调用代理对象的方法。
$$4 IDEA实现:
照着上面的,仿照写一个WX转账的。
1.代理目标类
多态
父类的引用指向子类的对象。
Object
2.实现接口,通过接口去实现核心方法
通过反射。
public class DTAPP implements InvocationHandler {
private Object object=new Object();
public DTAPP(Object o){
this.object=o;
}
public Object getProxyInstance(){
return Proxy.newProxyInstance(object.getClass().getClassLoader(), object.getClass().getInterfaces(),this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("功能的增强");
method.invoke(object,args);
return null;
}
}
DTAPP app1=new DTAPP(new ZFB());
DTAPP app2=new DTAPP(new WX());
ZZ zfb=(ZZ)app1.getProxyInstance();
zfb.zz("张三","李四",100.0);
WZ wx=(WZ)app2.getProxyInstance();
wx.WXZZ("王五","李梅",89.9);