• 导读
  • 概述
  • 实现类介绍
  • BeanNameAutoProxyCreator
  • DefaultAdvisorAutoProxyCreator
  • AnnotationAwareAspectJAutoProxyCreator
  • AOP总结

导读

Spring-AOP 自动创建代理

Spring-AOP 自动创建代理之BeanNameAutoProxyCreator

Spring-AOP 自动创建代理之DefaultAdvisorAutoProxyCreator

Spring-AOP 自动创建代理之AnnotationAwareAspectJAutoProxyCreator


概述

我们通过前面几篇博文的案例,我们会发现都是通过ProxyFactoryBean创建织入切面的代理,每个需要被代理的Bean都需要使用一个ProxyFactoryBean进行配置。

幸好Spring提供了自动代理机制,让容器自动生成代理,把开发人员从繁琐的配置中解脱出来。在内部,Spring使用BeanPostProcessor自动完成这项工作


实现类介绍

基于BeanPostProcessor的自动代理创建器的实现类,将根据一些规则自动在容器实例化Bean时为匹配的Bean生成代理内容。

这些代理创建器可以分为3类

  • 基于Bean配置名规则的自动代理创建器
    允许为一组特定配置名的Bean自动创建代理实例的代理创建器,实现类为BeanNameAutoProxyCreator

  • 基于Advisor匹配机制的自动代理创建器
    它会对容器中所有的Advisor进行扫描,自动将这些切面应用到匹配的Bean中(为目标Bean创建代理实例),实现类为DefaultAdvisorAutoProxyCreator

  • 基于Bean中的AspectJ注解标签的自动代理创建器
    为包含AspectJ注解的Bean自动创建代理实例,实现类为AnnotationAwareAspectJAutoProxyCreator.

自动创建代理器实现类的继承图

可以清楚的看到所有的自动代理器类都实现了BeanPostPorcessor,在容器实例化Bean时,BeanPostProcessor将对它进行加工处理,所以自动代理创建器有机会对满足匹配规则的bean自动创建代理对象


BeanNameAutoProxyCreator

请参考另外一篇博文 Spring-AOP 自动创建代理之BeanNameAutoProxyCreator


DefaultAdvisorAutoProxyCreator

请参考另外一篇博文 Spring-AOP 自动创建代理之DefaultAdvisorAutoProxyCreator


AnnotationAwareAspectJAutoProxyCreator

请参考另外一篇博文 Spring-AOP 自动创建代理之AnnotationAwareAspectJAutoProxyCreator


AOP总结

AOP是OOP的延伸,它为程序开发提供了一个崭新的思考角度,将可以重复性的横切逻辑抽取到统一的模块中,通过OOP的纵向抽象和AOP的横向抽取,程序才可以真正解决重复性代码问题。

Spring采用JDK动态代理和CGLib动态代理技术在运行期织入增强,所以不需要装备特殊的编译器或类装载器就可以使用AOP功能。

要使用JDK动态代理,目标类必须实现接口,而CGLib不对目标类作任何限制,它通过动态生成目标类子类的方式提供代理。

在JDK动态代理中通过接口来实现方法拦截,所以必须确保要拦截的目标在接口中有定义,否则将无法拦截

在CGLib动态代理中通过动态生成代理子类来实现方法拦截,所以必须确保要拦截的目标方法可以被子类访问,也就是目标方法必须定义为非final,且非私有实例方法。

JDK在创建代理对象时的性能高于CGLib,而生成的代理对象的运行性能却比CGLib低。 如果是singleton的代理,推荐使用CGlib动态代理。

Spring只能在方法级别上织入增强,Spring提供了4种类型的方法增强,分别是前置增强、后置增强、环绕增强、异常抛出增强,此外还有一种特殊的引介增强。 引介增强是类级别的,它为目标类织入新的接口实现。 从广义上将,增强其实是一种最简单的切面,它既包括横切代码又包括切点信息,只不过它的切点只是简单的方法相对位置信息。 所以增强一般需要和切点联合才可以表示一个更具实用性的切面。

在Spring中,普通的切点通过目标类名和方法名描述连接点的信息。 流程切点是比较特殊的切点,它通过方法调用堆栈的运行环境来决定连接点。 有时候需要通过切点的交叉或者合并描述一个最终的切点,可以使用ComposablePointcut的复合切点

切面是增强和切点的联合体,可以很方便的通过Spring提供的ProxyFactoryBean将切面自入不同的目标类中。 当然为每个目标类手工配置一个切面是比较繁琐的,Spring利用BeanPostProcessor可干涉Bean生命周期的机制,提供一些可以自动创建代理、自入切面的自动代理创建器,其中DefaultAdvisorAutoProxyCreator是功能强大的自动代理穿件器,它可以将容器中所有的Advisor自动织入目标Bean中。


Spring-AOP 自动创建代理相关推荐

  1. Spring AOP自动创建代理 和 ProxyFactoryBean创建代理

    Advice 通知类型 AOP联盟为通知Advice定义了org.aopalliance.aop.Interface.Advice,Spring按照通知Advice在目标方法的连接点位置,可以分为5种 ...

  2. Spring-AOP 自动创建代理之AnnotationAwareAspectJAutoProxyCreator

    文章目录 导读 实例 导读 Spring-AOP 自动创建代理 Spring-AOP 自动创建代理之BeanNameAutoProxyCreator Spring-AOP 自动创建代理之Default ...

  3. Spring-AOP 自动创建代理之DefaultAdvisorAutoProxyCreator

    文章目录 导读 概述 实例 导读 Spring-AOP 自动创建代理 Spring-AOP 自动创建代理之BeanNameAutoProxyCreator Spring-AOP 自动创建代理之Defa ...

  4. Spring-AOP 自动创建代理之BeanNameAutoProxyCreator

    文章目录 导读 实例 导读 Spring-AOP 自动创建代理 Spring-AOP 自动创建代理之BeanNameAutoProxyCreator Spring-AOP 自动创建代理之Default ...

  5. Spring : Spring Aop CGLIB动态代理调用过程

    1.美图 2.概述 CGLIB动态代理参考: CGLIB动态代理 CGLIB原理解析参考:CGLIB原理解析 3.分析 Spring AOP CGLIB动态代理调用过程分析,CGLIB动态代理调用过程 ...

  6. SpringBoot/Spring AOP默认动态代理方式

    Spring 5.x中AOP默认依旧使用JDK动态代理 SpringBoot 2.x开始,AOP为了解决使用JDK动态代理可能导致的类型转换异常,而使用CGLIB. 在SpringBoot 2.x中, ...

  7. 【Spring AOP】静态代理设计模式、Spring 动态代理开发详解、切入点详解(切入点表达式、切入点函数)

    AOP 编程 静态代理设计模式 1. 为什么需要代理设计模式 2. 代理设计模式 名词解释 代理开发的核心要素 静态代理编码 静态代理存在的问题 Spring 动态代理开发 搭建开发环境 Spring ...

  8. spring—AOP 的动态代理技术

    AOP 的动态代理技术 常用的动态代理技术 JDK 代理 : 基于接口的动态代理技术 cglib 代理:基于父类的动态代理技术 JDK 代理 public class proxy {@Testpubl ...

  9. SpringBoot 框架中 使用Spring Aop 、创建注解、创建枚举类 使用过程记录

    1.开始 在Springboot框架中引入AOP <dependency><groupId>org.springframework.boot</groupId>&l ...

最新文章

  1. Ant Design Pro 跳转路由 传参数,接收参数
  2. 在Ubuntu上源码安装MySQL+安装问题解决+安全优化
  3. Windows Embedded Compact 2013 安装体验
  4. 依赖注入容器Autofac的详解[转]
  5. 关于wpf,datagrid,双向数据绑定用法解决方案
  6. jq请求Ajax数据
  7. java nodefilter类,Java Servlet Filter过滤器概述
  8. 玩转SpringCloud Security OAuth2资源授权动态权限扩展
  9. 入门级都能看懂的softmax详解
  10. IE9如何降级返回IE8
  11. qq象棋辅助 android,QQ象棋自动下棋
  12. Java代理模式实现与原理详解(二)
  13. <PrivateImplementationDetails>.ComputeStringHash 错误解决办法
  14. 数字孪生|成熟度评价
  15. 破解版百度云【亲测好用】完美解决限速
  16. 别太在意人走茶凉 物是人非
  17. 使用js调用设备摄像头并实现拍照
  18. excel切片器_Excel表格中筛选数据,你的方法太笨了
  19. openshift书籍推荐
  20. 国产操作系统,路在何方?

热门文章

  1. 8行代码求解非线性方程
  2. 13. Leetcode 349. 两个数组的交集 (数组-分离双指针)
  3. XGBoost相关知识-1
  4. 深度学习核心技术精讲100篇(八十)-脏数据如何处理?置信学习解决方案
  5. 深度学习核心技术精讲100篇(三十)-ClickHouse在字节跳动广告业务中的应用
  6. Python零碎知识(3):对文件的基本操作
  7. 分布式计算Hadoop系列之如何Eclipse中构建Hadoop项目
  8. 高考特长计算机2017,2017年北京理工大学计算机学院申请竞赛获奖与特长生推荐.PDF...
  9. linux中sort不对的问题
  10. Pandas读取中文文本文件报错:python ‘utf-8‘ codec can‘t decode byte 0xe3 in position 0: unexpected end of data