spring 动态代理

Java动态代理机制的出现,使得Java开发人员不用手工编写代理类,只要简单地指定一组接口及委托类对象,便能动态地获得代理类,这是一套非常灵活有弹性的代理框架。


动态代理是在运行时在内存中构建的一种类型,该类型实现了接口I,但是它将所有的方法调用
都转发给类型A。



1.代理模式的作用和定义:
为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个客户不想或者不能直接
引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。


2.代理模式中涉及的角色
抽象角色:声明真实对象和代理对象的共同接口;一般声明为抽象类或是接口.
代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提
供与真实对象相同的接口以便在任何时刻都能代替真实对象。同时,代理对象可以在执行真实对
象操作时,附加其他的操作,相当于对真实对象进行封装。
真实角色:代理角色所代表的真实对象,是我们最终要引用的对象。
3.三个例子
4.真实角色必须是事先已经存在的,并将其作为代理对象的内部属性。但是实际使用时,一个真实
角色必须对应一个代理角色,如果大量使用会导致类的急剧膨胀;


在实际使用时,第一个参数obj一般是指代理类,method是被代理的方法,如上例中的dothing()
,args为该方法的参数数组。 这个抽象方法在代理类中动态实现。


通过这种方式,被代理的对象(RealSubject)可以在运行时动态改变,需要控制的接口(Subject
接口)可以在运行时改变,控制的方式
(DynamicSubject类)也可以动态改变,从而实现了非常灵活的动态代理关系。


动态代理:



比如我们现有一百个类,每个类都有很多的方法,而我们在调用的时候根本不关心他是那个
类的那个方法,只需要能够达到我们的目标就可以了。
但是现再我们要明确的知道我们调用是那个类里的那个方法,而且还要在执行的这个方法之
前或者结束的时候执行一些特殊的语句时。这样就很不方便了,我们的每个方法都要加上相同
的语句。
为了解决这个问题,随之就出现了代理了。代理分为了二种:


静态代理与动态代理,
静态代理类:
由程序员创建或由特定工具自动生成源代码,再对其编译。在程序运行前,代理类的
.class文件就已经存在了。
动态代理类:在程序运行时,运用反射机制动态创建而成。
在这里我使用的是动态代理,下面讲一下动态代理吧:
什么是动态代理呢?
为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个客户不想或者不能直
接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
怎样使用动态代理呢:


 1.
动态代理的核心是一个InvocationHandler,我们要实现这个接口,创建自己的调用处理器;然后覆盖里面的
invoke方法,我们可以在这里面设定他的权限,如那些方法不需要在方法执行前或者执行后执行一些
别的语句,或者设定那个包下的所有方法不需要执行这些语句。如果后面我又想使用这些方法
都执行这些语句时,我们只要在invoke里面判断一下就可以了,这样很方便。


 2.通过为Proxy类指定ClassLoader对象和一组interface来创建动态代理类;
 3.通过反射机制获得动态代理类的构造函数,其唯一参数类型是调用处理器接口类型;
 4.通过构造函数创建动态代理类实例,构造时调用处理器对象作为参数被传入。




在我们使用的时候,invoke的第一个参数obj一般是指代理类,method是被代理的方法,如上例
中的dothing(),args为该方法的参数数组。 这个抽象方法在代理类中动态实现。
通过动态代理,被代理的对象可以在运行时动态改变,需要控制的接口可以在运行时改变,控制
的方式也可以动态改变,从而实现了非常灵活的动态代理关系。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值