Aop源码分析之生成代理对象
2016-05-08 16:04
573 查看
Java中生成代理对象有两种方式,一种是Jdk原生的动态代理,另一种就是利用Cglib。Jdk原生的动态代理只能实现对接口的代理,无法实现对Class类的代理,因此Spring中引入Cglib来实现Class类的动态代理。
Aop中代理对象是在ProxyFactoryBean类的getSingletonInstance方法中生成的。
进入createAopProxy方法。createAopProxy方法中只是简单的调用了下DefaultAopProxyFactory类的createAopProxy方法。那么重点来分析下createAopProxy方法。
createAopProxy方法中有两种代理方式,分别是Jdk和Cglib,如果被代理的是接口,就用Jdk代理方式,如果是类,就用Cglib代理方式。
回到getProxy方法,查看使用这两种方式生成代理对象的具体过程。
这里以Cglib的方式为例。
首先从advised中获取配置文件中配置的目标对象,即target对象。然后创建并配置Cglib的Enhancer对象,Enhancer对象是Cglib中实现动态代理的主要操作类。设置Enhancer对象的过程中,设置其setCallbacks方法是重点。Enhancer中的Callbacks就跟Jdk的Proxy对象的invoke方法一样,代理相关逻辑的实现都在该方法中,也就是说Aop相关的功能都封装在里面。最后使用Enhancer的create方法生成代理对象。经过这一步之后,通过getBean方法获得的对象就不是目标对象原始的对象了,而是代理对象。
这个时候调用目标对象相应的方法就会被拦截器所拦截,对于不同的代理对象生成方式会调用不同的拦截回调入口。对于Jdk代理方式,因为实现了InvocationHandler接口,所以回调入口就是invoke。而对于Cglib方式,使用的则是回调方法中设置好的DynamicUnadvisedExposedInterceptor类的intercept方法。
拦截器和回调方法都已设置好,只要调用目标对象被代理的方法就会触发这些拦截器并调用回调方法。那么拦截器是如何实现的?回调方法里面有些什么呢?下回分解。。。。。。
Aop中代理对象是在ProxyFactoryBean类的getSingletonInstance方法中生成的。
进入createAopProxy方法。createAopProxy方法中只是简单的调用了下DefaultAopProxyFactory类的createAopProxy方法。那么重点来分析下createAopProxy方法。
createAopProxy方法中有两种代理方式,分别是Jdk和Cglib,如果被代理的是接口,就用Jdk代理方式,如果是类,就用Cglib代理方式。
回到getProxy方法,查看使用这两种方式生成代理对象的具体过程。
这里以Cglib的方式为例。
首先从advised中获取配置文件中配置的目标对象,即target对象。然后创建并配置Cglib的Enhancer对象,Enhancer对象是Cglib中实现动态代理的主要操作类。设置Enhancer对象的过程中,设置其setCallbacks方法是重点。Enhancer中的Callbacks就跟Jdk的Proxy对象的invoke方法一样,代理相关逻辑的实现都在该方法中,也就是说Aop相关的功能都封装在里面。最后使用Enhancer的create方法生成代理对象。经过这一步之后,通过getBean方法获得的对象就不是目标对象原始的对象了,而是代理对象。
这个时候调用目标对象相应的方法就会被拦截器所拦截,对于不同的代理对象生成方式会调用不同的拦截回调入口。对于Jdk代理方式,因为实现了InvocationHandler接口,所以回调入口就是invoke。而对于Cglib方式,使用的则是回调方法中设置好的DynamicUnadvisedExposedInterceptor类的intercept方法。
拦截器和回调方法都已设置好,只要调用目标对象被代理的方法就会触发这些拦截器并调用回调方法。那么拦截器是如何实现的?回调方法里面有些什么呢?下回分解。。。。。。
相关文章推荐
- ubuntu14.04 下 tomcat7.0.69部署solr4.10.4
- CentOS6.5安装RHive
- Android系统架构
- 个人对AOP概念的理解
- linux epoll 简单demo
- [干货分享]浅谈seo如何提高网站权重
- Linux设备驱动(3)常用的宏、结构体、数据类型、函数等
- 山寨Besiege(三)需求分析与架构设计
- CentOS7安装小小输入法
- CentOS6.5安装RHBase
- 将centos 7改造为LINUX桌面系统
- linux非常实用的查找错误命令
- Nginx负载均衡的几种算法
- 如何测试一个网站的性能(并发数)?
- OpenGL旋转平移 变换
- Linux根文件系统制作
- Nginx与Apache对比
- 优秀网站博客集锦
- 《大型网站系统与JAVA中间件实践》读书笔记
- Linux mysql设置表名不区分大小写,设置编码