AOP个人理解

AOP

为什么要使用AOP

AOP是OOP(面向对象)的补充,为什么说是补充呢?
OOP是面向对象编程,面向对象的三大特征:封装,继承,多态
因此OOP是定义纵向关系的,这就带来了一系列代码重用的问题
AOP是面向切面编程,它作为OOP的补充,将那些与业务无关,但却对多个对象产生影响的公共部分抽取出来封装成一个可重用的模块,降低了代码之间的耦合度,也提高了系统的可维护性.

什么是AOP

AOP的实现在于代理模式,主要分为静态代理和动态代理,
静态代理以Asceptj为代表
动态代理以Spring AOP为代表
Aspectj是静态代理的增强,就是在编译阶段生成AOP代理类,因此也叫编译时增强,它会在编译阶段将Aspectj(切面)织入到java字节码中,运行的时候就是运行的增强后的AOP对象
Spring AOP是动态代理,就是在运行时在内存中临时为方法生成一个AOP对象,这个AOP对象包含了目标对象的全部方法,并且在特定的切点做了增强处理,并回调原对象的方法.

怎样使用AOP

spring aop中的动态代理主要有两种方式,JDK动态代理和CGlib动态代理
CGlib代理:利用ASM框架,对代理对象生成的class字节码文件加载进来,通过修改其字节码生成子类来处理
JDK动态代理:利用拦截器(实现InvocationHandler)加上反射机制生成一个代理接口的匿名类,在调用具体方法前调用IncokeHandler来处理
什么时候用cglib什么时候用jdk代理模式?
目标对象生成了使用接口 默认使用jdk动态代理
如果目标对象使用了接口 可以强制使用cglib
如果目标对象没有实现接口,必须采用cglib库,spring会自动在JDK动态代理和cglib之间切换
两者的区别?
jdk动态代理只能对实现了接口的类生成代理
cglib是针对实现类代理,只要是对指定的类生成一个子类,覆盖其中的方法,并覆盖其中方法的增强,但是因为采用的是继承,所以该类或方法最好不要生成final,对于final类或方法,是无法继承的

本文系作者 @ 原创发布在 IT梦。未经许可,禁止转载。

喜欢()
5 1 投票
Article Rating
订阅评论
提醒
guest
0 评论
内联反馈
查看所有评论
热门搜索
27 文章
12 评论
76 喜欢
Top
0
希望看到您的想法,请您发表评论x
()
x