springAOP的源码分析
什么是AOP
aop就是面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术;
相信大家在实际项目中都使用过了,比如日志记录啊,接口相应时间等等…
为什么要深入AOP
以前知道aop是通过动态代理来实现的,但是怎么个代理法呢,确不是很清楚,不明白aop就像吃着米饭但是不知道大米是怎么来的,这种感觉,你懂得,当然很多人说,那你怎么不去了解芯片啊是怎么做的?等等高科技问题,对此我只想说,收到!
首先说动态代理:
动态代理就是为其他对象提供一个代理以控制对某个对象的访问。
代理类主要负责为委托了(真实对象)预处理消息、过滤消息、传递消息给委托类,代理类不现实具体服务,而是利用委托类来完成服务,并将执行结果封装处理。
大家都知道java实现动态代理有两种,一种是jdk动态代理,一种是cglib动态代理.
两者区别大概就是jdk的话是通过实现接口来完成代理,代理类内持有原代理类的引用,所以原代理类必须实现接口,cglib的话就不需要了.有空可以去看看cglib是怎么实现的,我只知道是通过反射.具体的忘记了…=-=
然后spring通过动态代理来实现aop的,spring的话如果类有实现某个接口就是使用jdk动态代理,如果没有就使用的cglib的动态代理.
代码测试:
TestServiceImpl实现了TestService,CglibServiceImpl没有实现:
怎么生成的代理类
首先,应该了解,springioc容器其实就是Map里面存的对象,
但是对象是什么时候存进去的呢?通过map的put方法,就找到了:
这时候看debug:
通过设置条件断点,一步一步找,从初始化bean工厂后进行debug:
通过执行后置处理的时候找到我们的注解PostProcessor,spring的Processor其实就是一些列的接口,做完什么事情的时候去做Processor里面的方法.
然后就能看见createProxy方法:
然后再往下走就看见返回代理的主要方法:
可以通过断点看每次返回的是jdk动态代理,还是cglib动态代理.这里就是spring进行动态代理的源码的地方,