什么是AOP ?
AOP的全称为Aspect Oriented Programing, 即面向切面编程。
AOP采取横向抽取机制,取代了传统纵向继承体系重复性代码(性能监视、事务管理、安全检查、缓存)
AOP的原理:
使用代理模式,在程序中为目标对象,创建一个代理对象,将重复代码抽取出来,在访问目标对象时,通过代理对象去调用重复性代码 ,实现在不改变目标对象代码情况下,对目标进行增强
AOP 企业中主流应用 :
1.性能监视 (通过AOP知道运行了哪个方法, 监控目标方法运行时间 )
2.事务管理 (在目标方法调用前开启事务,在方法调用后 提交事务 )
3.安全检查 (在访问目标方法时,判断用户是否具有目标方法访问权限,如果具有调用目标方法,如果不具有, 阻止访问)
4.缓存 (调用目标方法是为了获取一些数据,在代理中缓存这些数据 )
Spring中AOP 其实分为两种
1.传统Spring AOP 主要Spring 1.x 版本(使用ProxyFactoryBean 为目标对象创建代理对象 )
2.Spring2.0开始 整合 AspectJ AOP 开源框架
AOP 相关术语 :
Joinpoint(连接点) : 所谓连接点是指那些被拦截到的点。在spring中,这些点指的是方法,因为spring只支持方法类型的连接点.
Pointcut(切入点) : 所谓切入点是指我们要对哪些Joinpoint进行拦截的定义.
Advice(通知/增强) : 所谓通知是指拦截到Joinpoint之后所要做的事情就是通知.通知分为前置通知,后置通知,异常通知,最终通知,环绕通知(切面要完成的功能)
Introduction(引介) : 引介是一种特殊的通知在不修改类代码的前提下, Introduction可以在运行期为类动态地添加一些方法或Field.
Target(目标对象) : 代理的目标对象
Weaving(织入) : 是指把增强应用到目标对象来创建新的代理对象的过程.
spring采用动态代理织入,而AspectJ采用编译期织入和类装在期织入
Proxy(代理) : 一个类被AOP织入增强后,就产生一个结果代理类
Aspect(切面) : 是切入点和通知(引介)的结合
AOP 是基于代理技术 (静态代理或者动态代理 )
Spring AOP 底层是基于动态代理 (JDK动态代理 和 Cglib 动态代理 )
Spring在运行期,生成动态代理对象,不需要特殊的编译器
Spring AOP的底层就是通过JDK动态代理或CGLib动态代理技术 为目标Bean执行横向织入
1.若目标对象实现了若干接口,spring使用JDK的java.lang.reflect.Proxy类代理。
2.若目标对象没有实现任何接口,spring使用CGLIB库生成目标对象的子类。
程序中应优先对接口创建代理,便于程序解耦维护
标记为final的方法,不能被代理,因为无法进行覆盖
JDK动态代理,是针对接口生成子类,接口中方法不能使用final修饰
CGLib 是针对目标类生产子类,因此类或方法 不能使final的
Spring只支持方法连接点,不提供属性连接
Spring AOP 优先对接口进行代理,使用JDK动态代理
如果被代理目标没有接口,对类进行代理, 使用Cglib动态代理
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/12099.html