【源码】Spring AOP 9 Advised

  • 前言
  • Advised
    • AdvisedSupport
      • ProxyCreatorSupport
  • 类图
  • 总结
  • 参考

前言

Advised ,个人理解为对整个代理执行的抽象

Advised

// TargetClassAware 目标类的维护
public interface Advised extends TargetClassAware {// 配置冻结,则 advice 不可改变boolean isFrozen();// 是否代理目标类(而不是接口),关系到代理方式(JDK | CGLIB)boolean isProxyTargetClass();// 返回 target class 以外的所有接口Class<?>[] getProxiedInterfaces();// 确定给定接口是否被代理boolean isInterfaceProxied(Class<?> intf);// 以 Advised 对象改变 TargetSource(注意isFrozen) void setTargetSource(TargetSource targetSource);TargetSource getTargetSource();/*** 是否允许 AOP 框架以 ThreadLocal 的形式将代理对象暴露出去,* 允许通过 AopContext 访问。这个属性默认为 false。* 设置为 true 时,允许我们使用 AopConext.currentProxy() * 获取当前代理对象(内部以 NamedThreadLocal 维护)*/ void setExposeProxy(boolean exposeProxy);boolean isExposeProxy();/*** 此属性默认为false,设置为 true 时,* 创建对象时获取 advisor chain 可以跳过 ClassFilter 检查*/void setPreFiltered(boolean preFiltered);boolean isPreFiltered();// Advisor 相关操作Advisor[] getAdvisors();void addAdvisor(Advisor advisor) throws AopConfigException;void addAdvisor(int pos, Advisor advisor) throws AopConfigException;boolean removeAdvisor(Advisor advisor);void removeAdvisor(int index) throws AopConfigException;int indexOf(Advisor advisor);boolean replaceAdvisor(Advisor a, Advisor b) throws AopConfigException;// advice 相关操作void addAdvice(Advice advice) throws AopConfigException;void addAdvice(int pos, Advice advice) throws AopConfigException;boolean removeAdvice(Advice advice);int indexOf(Advice advice);String toProxyConfigString();}
  • 它维护代理相关的一些属性 frozen proxyTargetClass
  • 它维护整个代理行为对应的 Advisors Advice

AdvisedSupport

public class AdvisedSupport extends ProxyConfig implements Advised {// 基于 List 管理的 Advisor 的相关操作...// Advice 通常都是封装成 DefaultPointcutAdvisor 进行操作...AdvisorChainFactory advisorChainFactory = new DefaultAdvisorChainFactory();// 基于 DefaultAdvisorChainFactory#getInterceptorsAndDynamicInterceptionAdvice 方法实现public List<Object> getInterceptorsAndDynamicInterceptionAdvice(Method method, @Nullable Class<?> targetClass) {MethodCacheKey cacheKey = new MethodCacheKey(method);List<Object> cached = this.methodCache.get(cacheKey);if (cached == null) {cached = this.advisorChainFactory.getInterceptorsAndDynamicInterceptionAdvice(this, method, targetClass);this.methodCache.put(cacheKey, cached);}return cached;}}
  • 作为一个基类实现了提供了 Advisor Advice 管理的相关方法实现
  • 额外提供了方法 getInterceptorsAndDynamicInterceptionAdvice 是基于成员属性 DefaultAdvisorChainFactory#getInterceptorsAndDynamicInterceptionAdvice 来实现的,这个之前了解过

ProxyCreatorSupport

public class ProxyCreatorSupport extends AdvisedSupport {// ...public ProxyCreatorSupport() {this.aopProxyFactory = new DefaultAopProxyFactory();}public ProxyCreatorSupport(AopProxyFactory aopProxyFactory) {this.aopProxyFactory = aopProxyFactory;}// 创建代理,使用代理创建器工厂创建代理创建器,用代理创建器创建代理protected final synchronized AopProxy createAopProxy() {if (!this.active) {activate();}return getAopProxyFactory().createAopProxy(this);}}
  • AdvisedSupport 的基础上提供了代理创建方法 createAopProxy
  • createAopProxy 方法委托 AopProxyFactory 实现,构造方法允许指定 AopProxyFactory,默认 DefaultAopProxyFactory,之后会了解

类图

总结

Advised 接口主要是抽象整个代理的行为,比如维护具体的 Advisors Advices,提供具体的 Interceptors Chains,提供具体的创建代理方法

它的三个实现类可以直接用来创建代理对象,下一章节具体了解这三个实现类

上一篇:【源码】Spring AOP 8 TargetSource AdvisorAdapter AdvisorAdapterRegistry AdvisorChainFactory
下一篇:【源码】Spring AOP 10 ProxyFactoryBean ProxyFactory AspectJProxyFactory

参考

【小家Spring】Spring AOP各个组件概述与总结【Pointcut、Advice、Advisor、Advised、TargetSource、AdvisorChainFactory…】

【源码】Spring AOP 9 Advised相关推荐

  1. 【Spring源码】AOP切面源码

    [Spring源码]AOP切面源码 关键词 后置处理器BeanPostProcessor后置方法:applyBeanPostProcessorsAfterInitialization() 切面后置处理 ...

  2. 【栖梧-源码-spring】@Bean从解析到注册到beanDefinitionMap

    [栖梧-源码-spring]@Bean从解析到注册到beanDefinitionMap 序幕 源码阅读技巧 本文说明 类 ConfigurationClassParser#doProcessConfi ...

  3. Spring AOP源码解析——AOP动态代理原理和实现方式

    2019独角兽企业重金招聘Python工程师标准>>> Spring介绍 Spring(http://spring.io/)是一个轻量级的Java 开发框架,同时也是轻量级的IoC和 ...

  4. 从Spring源码探究AOP代码织入的过程

    随着不断地使用Spring,以及后续的Boot.cloud,不断的体会到这个拯救Java的生态体系的强大,也使我对于这个框架有了极大的好奇心,以至于产生了我为什么不能写一个这样的框架的思考. 通过自学 ...

  5. spring源码阅读--aop实现原理分析

    aop实现原理简介 首先我们都知道aop的基本原理就是动态代理思想,在设计模式之代理模式中有介绍过这两种动态代理的使用与基本原理,再次不再叙述. 这里分析的是,在spring中是如何基于动态代理的思想 ...

  6. Spring源码:AOP转文

    Spring源码分析-深入浅出AOP(图文分析) https://blog.csdn.net/c_unclezhang/article/details/78769426 Spring中AOP的配置从1 ...

  7. 专治不会看源码的毛病--spring源码解析AOP篇(2017版)

    昨天有个大牛说我啰嗦,眼光比较细碎,看不到重点.太他爷爷的有道理了!要说看人品,还是女孩子强一些.原来记得看到一个男孩子的抱怨,说怎么两人刚刚开始在一起,女孩子在心里就已经和他过完了一辈子.哥哥们,不 ...

  8. Spring源码——动态AOP实现流程

    前言 最近回顾了一下Spring源码,准备用思维导图的方式简单的将整个源码内容的流程展示出来,思维导图.图片等文件更新在https://github.com/MrSorrow/spring-frame ...

  9. Spring源码:AOP(1)

    AOP的组成部分 几个关键部分: 一个是AOP的配置(拦截规则的配置),一个是代理对象的创建,一个是统一的拦截调用过程. AOP的配置:Spring是自己定义了一套规则同时集成了AspectJ的语法, ...

  10. (附源码)spring boot宠物医院管理系统 毕业设计180923

    Springboot宠物医院管理系统 摘 要 现如今生活质量提高,人们追求精神健康,与家中宠物朝夕相处,感情深厚,宠物渐渐成了我们身边的朋友.因而宠物生病了,需要去看病,自古医院救死扶伤,生命无贵贱, ...

最新文章

  1. 【深度学习】高效读取数据的方法(TFRecord)
  2. 【转】msyql使用-用户创建/权限配置
  3. 中文 Python 开源资料合集!这应该是最全的了!
  4. 来腾讯云开发者实验室 学习.NET
  5. 【亲测】二极管电压测试“跳坑”注意事项——硬件的板载测试验证
  6. 一元多项式的建立及加减
  7. 使用SQL Server数据工具进行SQL单元测试
  8. 区块链开发_比特币开发1
  9. Suse Enterprise Server 11的安装
  10. html ubb c,UBB代码和HTML代码的区别
  11. python 爬取国内高匿代理ip(西刺代理)整站DOWN下来
  12. 在Excel中批量生成二维码标签,标签中可添加二维码或者条形码
  13. 机器学习中Bias(偏差)和Variance(方差)
  14. ACM/IOI 历年国家集训队论文集和论文算法分类整理
  15. 浅析 HLS 流媒体协议
  16. POI实现超大数据的Excel的读写操作,支持Excel最大行数。
  17. thrift夸语言编程,facebok
  18. RSA加密算法(32bit比特级运算)(复杂版)(C++实现)
  19. 我的世界服务器怎么制作头颅,我的世界怎么刷生物头颅_生物头颅制作方法_游戏城...
  20. 【ES知识】ES基础查询语法一览

热门文章

  1. java中以yyyyMMddHHmmss格式取得系统时间
  2. 年过八旬指的是多少岁
  3. 安卓抓jdwskey
  4. 魔兽世界3区部落最多的服务器,魔兽世界怀旧服玩家为你推荐,不用排队、非鬼服非单阵营的服务器...
  5. 有吧友需要PDF的下载站点,好吧,我这边汇总一下
  6. 如何改变python的背景颜色_怎样使用python改变背景颜色
  7. 谷歌身份验证器插件以及基于utools的otp快捷使用
  8. mybatis where 标签使用
  9. 一些webGL地球的网址
  10. 内容公链Contentos首席科学家不建议刚毕业的年轻人直接从事区块链开发