博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring系列之Spring框架和SpringAOP集成过程分析(十二)
阅读量:5912 次
发布时间:2019-06-19

本文共 2962 字,大约阅读时间需要 9 分钟。

转载请注明出处:https://blog.csdn.net/zknxx/article/details/80808447 在这篇文章中我们接着上一篇的文章说。在上一篇文章中我们提到了getAdvicesAndAdvisorsForBean这个方法,这个方法的内容是为目标对象挑选合适的Advisor类,其源码如下:

//targetSource 为null	protected Object[] getAdvicesAndAdvisorsForBean(Class
beanClass, String beanName, TargetSource targetSource) { List
advisors = findEligibleAdvisors(beanClass, beanName); //如果获取的Advisor为空的话,则直接返回DO_NOT_PROXY 返回这个值的时候 是不创建代理对象 if (advisors.isEmpty()) { return DO_NOT_PROXY; } return advisors.toArray(); } protected List
findEligibleAdvisors(Class
beanClass, String beanName) { //这个方法我们在上一章中分析过了 获取Spring容器中的所有的通知方法 封装为Advisor集合 List
candidateAdvisors = findCandidateAdvisors(); //这一步就是为目标对象挑选合适的Advisor 即目标对象和切点表达式相匹配 //此处的分析 请参考这里:https://blog.csdn.net/zknxx/article/details/79735405 List
eligibleAdvisors = findAdvisorsThatCanApply(candidateAdvisors, beanClass, beanName); //这个方法做的事是向 上一步获取到的Advisor中 插入ExposeInvocationInterceptor.ADVISOR 插在第一个位置 extendAdvisors(eligibleAdvisors); if (!eligibleAdvisors.isEmpty()) { //排序 很复杂的实现 不说了 如果你对一个目标对象使用多个 相同类型的通知的话 请把这些通知放到不同的Aspect中,并实现Order接口或者使用Ordered注解标注顺序 eligibleAdvisors = sortAdvisors(eligibleAdvisors); } return eligibleAdvisors; }复制代码

最后我们再看看目标对象的创建过程:

//specificInterceptors 上面的方法中获取到的Advisor 	//targetSource 为 new SingletonTargetSource(bean) 	//将Spring容器中创建出来的bean封装为了SingletonTargetSource	protected Object createProxy(			Class
beanClass, String beanName, Object[] specificInterceptors, TargetSource targetSource) { //这里将目标Bean的Class设置为BeanDefinition中的一个属性 //在使用JDK动态代理的时候 可能会用到这个属性 https://stackoverflow.com/questions/45463757/what-is-interface-based-proxying if (this.beanFactory instanceof ConfigurableListableBeanFactory) { AutoProxyUtils.exposeTargetClass((ConfigurableListableBeanFactory) this.beanFactory, beanName, beanClass); } //这里创建了一个新的 ProxyFactory ProxyFactory proxyFactory = new ProxyFactory(); //copy原类的配置 重写赋值的动作 单例变多例 proxyFactory.copyFrom(this); //这里是 判断是否强制使用 cglib if (!proxyFactory.isProxyTargetClass()) { //这里 判断是 使用jdk动态代理 还是cglib代理 if (shouldProxyTargetClass(beanClass, beanName)) { proxyFactory.setProxyTargetClass(true); } else { evaluateProxyInterfaces(beanClass, proxyFactory); } } //这里又重写构建了一次 Advisor 看看是否 设置了通用的拦截 //这里讲所有的Advisor和配置的通用拦截都转换为了Advisor类型 Advisor[] advisors = buildAdvisors(beanName, specificInterceptors); for (Advisor advisor : advisors) { proxyFactory.addAdvisor(advisor); } //targetSource 里是包含目标对象的 proxyFactory.setTargetSource(targetSource); customizeProxyFactory(proxyFactory); proxyFactory.setFrozen(this.freezeProxy); if (advisorsPreFiltered()) { proxyFactory.setPreFiltered(true); } //创建代理对象 关于创建代理对象的分析 请参考:https://blog.csdn.net/zknxx/article/details/79764107 return proxyFactory.getProxy(getProxyClassLoader()); }复制代码

好了,到此关于AOP的分析就先暂时告一段落了。 转载请注明出处:https://blog.csdn.net/zknxx/article/details/80808447

你可能感兴趣的文章
关于迭代測试的一些思考
查看>>
2017-4-28 ListView控件
查看>>
判断具有某个属性js、jQuery
查看>>
jsp页面从标签属性中获取值
查看>>
支持触摸设备的响应式HTML5音频播放器 - AudioPlayer.js
查看>>
【转】驱动和应用层的三种通信方式
查看>>
输出使能详解STM32的PWM输出——寄存器配置六步曲!
查看>>
Php 操作sqlite3 文本数据库
查看>>
TP-link WR703N, OpenWrt, Mentohust
查看>>
Vim升华之树形目录插件NERDTree安装图解
查看>>
手动方式SQL注入脚本命令之精华版
查看>>
MVC3学习:利用mvc3+ajax实现登录
查看>>
看看国外的javascript题目,你能全部做对吗?
查看>>
遍历INI文件和删除指定域内容
查看>>
程序员技术练级攻略
查看>>
IIS7配置伪静态把后缀名映射为html方案
查看>>
JS随机生成不重复数据的代码分享
查看>>
poj1679
查看>>
JavaScript实时显示当前时间的例子
查看>>
开发的阅读文档来源灵感
查看>>