java基础---动态代理机制
动态代理的意思是,有一个委托类有一个代理类,让代理类去实现委托类的方法,这样既可以对委托类的代码实现进行封装和隐藏,还能够在委托类的基础上添加额外的一些自定义处理。
两种代理方式
1.jdk原生的代理方式
2.cglib方式
===使用jdk动态代理的流程
1.创建接口
2.创建委托类实现接口
3.创建代理类实现invocationHandler接口,绑定委托类,实现invoke方法。
绑定委托类:使用Proxy.newProxyInstance方法来绑定委托类返回一个代理对象,传入三个参数:委托类的类加载器,委托类接口,代理类。
实现invoke代理方法
Object invoke(Object proxy, Method method, Object[] args) throws Throwable
proxy: 指代我们所代理的那个真实对象
method: 指代的是我们所要调用真实对象的某个方法的Method对象
args: 指代的是调用真实对象某个方法时接受的参数
最后就是创建代理类,绑定后直接调用代理类的方法就可以了。
===详细描述cglib动态代理的实现方式?
采用字节码技术为一个类创建子类,也就是代理类,使用代理类去实现父类的方法。
1.创建委托类
2.创建代理类,实现MethodInterceptor接口,实现intercept方法,在intercept方法里面拦截委托类的方法并且进行增强。
3.通过代理类的getProxy方法创建代理对象,入参是父类的字节码。
====jdk实现的动态代理和CGLIB实现的动态代理有什么区别?在spring中切面编程使用的是哪一种呢?
jdk实现的时候使用newProxyInstance创建代理对象的时候必须有委托类的接口,所以jdk方式必须有接口;代理类实现了和委托类同样的接口。
CGlib创建代理类对象不需要接口,生成的类是委托类的子类,实现MethodIntercept接口实现intercept方法。
spring AOP代理机制:
1、若目标对象实现了若干接口,spring使用JDK的java.lang.reflect.Proxy类代理。
优点:因为有接口,所以使系统更加松耦合
缺点:为每一个目标类创建接口
2、若目标对象没有实现任何接口,spring使用CGLIB库生成目标对象的子类。
优点:因为代理类与目标类是继承关系,所以不需要有接口的存在。
缺点:因为没有使用接口,所以系统的耦合性没有使用JDK的动态代理好。
====动态代理有什么用处?用代理类实现方法有什么好处?
用处:
1.权限管理
2.日志管理
3.事务管理
好处:
1.隐藏委托类的实现细节,通过代理类在做处理,还能够在原方法基础上添加新的实现。
2.能够在应用运行过程中动态创建对象或者做修改操作而不需要停下应用。实际生产中这是很重要的。