Spring-AOP 自动创建代理
- 导读
- 概述
- 实现类介绍
- 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 自动创建代理相关推荐
- Spring AOP自动创建代理 和 ProxyFactoryBean创建代理
Advice 通知类型 AOP联盟为通知Advice定义了org.aopalliance.aop.Interface.Advice,Spring按照通知Advice在目标方法的连接点位置,可以分为5种 ...
- Spring-AOP 自动创建代理之AnnotationAwareAspectJAutoProxyCreator
文章目录 导读 实例 导读 Spring-AOP 自动创建代理 Spring-AOP 自动创建代理之BeanNameAutoProxyCreator Spring-AOP 自动创建代理之Default ...
- Spring-AOP 自动创建代理之DefaultAdvisorAutoProxyCreator
文章目录 导读 概述 实例 导读 Spring-AOP 自动创建代理 Spring-AOP 自动创建代理之BeanNameAutoProxyCreator Spring-AOP 自动创建代理之Defa ...
- Spring-AOP 自动创建代理之BeanNameAutoProxyCreator
文章目录 导读 实例 导读 Spring-AOP 自动创建代理 Spring-AOP 自动创建代理之BeanNameAutoProxyCreator Spring-AOP 自动创建代理之Default ...
- Spring : Spring Aop CGLIB动态代理调用过程
1.美图 2.概述 CGLIB动态代理参考: CGLIB动态代理 CGLIB原理解析参考:CGLIB原理解析 3.分析 Spring AOP CGLIB动态代理调用过程分析,CGLIB动态代理调用过程 ...
- SpringBoot/Spring AOP默认动态代理方式
Spring 5.x中AOP默认依旧使用JDK动态代理 SpringBoot 2.x开始,AOP为了解决使用JDK动态代理可能导致的类型转换异常,而使用CGLIB. 在SpringBoot 2.x中, ...
- 【Spring AOP】静态代理设计模式、Spring 动态代理开发详解、切入点详解(切入点表达式、切入点函数)
AOP 编程 静态代理设计模式 1. 为什么需要代理设计模式 2. 代理设计模式 名词解释 代理开发的核心要素 静态代理编码 静态代理存在的问题 Spring 动态代理开发 搭建开发环境 Spring ...
- spring—AOP 的动态代理技术
AOP 的动态代理技术 常用的动态代理技术 JDK 代理 : 基于接口的动态代理技术 cglib 代理:基于父类的动态代理技术 JDK 代理 public class proxy {@Testpubl ...
- SpringBoot 框架中 使用Spring Aop 、创建注解、创建枚举类 使用过程记录
1.开始 在Springboot框架中引入AOP <dependency><groupId>org.springframework.boot</groupId>&l ...
最新文章
- Ant Design Pro 跳转路由 传参数,接收参数
- 在Ubuntu上源码安装MySQL+安装问题解决+安全优化
- Windows Embedded Compact 2013 安装体验
- 依赖注入容器Autofac的详解[转]
- 关于wpf,datagrid,双向数据绑定用法解决方案
- jq请求Ajax数据
- java nodefilter类,Java Servlet Filter过滤器概述
- 玩转SpringCloud Security OAuth2资源授权动态权限扩展
- 入门级都能看懂的softmax详解
- IE9如何降级返回IE8
- qq象棋辅助 android,QQ象棋自动下棋
- Java代理模式实现与原理详解(二)
- <PrivateImplementationDetails>.ComputeStringHash 错误解决办法
- 数字孪生|成熟度评价
- 破解版百度云【亲测好用】完美解决限速
- 别太在意人走茶凉 物是人非
- 使用js调用设备摄像头并实现拍照
- excel切片器_Excel表格中筛选数据,你的方法太笨了
- openshift书籍推荐
- 国产操作系统,路在何方?
热门文章
- 8行代码求解非线性方程
- 13. Leetcode 349. 两个数组的交集 (数组-分离双指针)
- XGBoost相关知识-1
- 深度学习核心技术精讲100篇(八十)-脏数据如何处理?置信学习解决方案
- 深度学习核心技术精讲100篇(三十)-ClickHouse在字节跳动广告业务中的应用
- Python零碎知识(3):对文件的基本操作
- 分布式计算Hadoop系列之如何Eclipse中构建Hadoop项目
- 高考特长计算机2017,2017年北京理工大学计算机学院申请竞赛获奖与特长生推荐.PDF...
- linux中sort不对的问题
- Pandas读取中文文本文件报错:python ‘utf-8‘ codec can‘t decode byte 0xe3 in position 0: unexpected end of data