SpringAOP原理(⾯试必备)
⼀、AOP是什么?
AOP的全称是Aspect Orient Programming,即⾯向切⾯编程。是对OOP(Object Orient Programming)的⼀种补充,战门⽤于处理⼀些具有横切性质的服务。常常⽤于⽇志输出、安全控制等。
上⾯说到是对OOP的⼀种补充,具体补充的是什么呢?考虑⼀种情况,如果我们需要在所有⽅法执⾏前打印⼀句⽇志,按照OOP的处理思想,我们需要在每个业务⽅法开始时加⼊⼀些语句,但是我们⾟⾟苦苦加完之后,如果⼜要求在这句⽇志打印后再打印⼀句,那是不是⼜要加⼀遍?这时候你⼀定会想到,在某个类中编写⼀个⽇志打印⽅法,该⽅法执⾏这些⽇志打印操作,然后在每个业务⽅法之前加⼊这句⽅法调⽤,这就是⾯向对象编程思想。但是如果要求我们在业务⽅法结束时再打印⼀些⽇志呢,是不是还要去每个业务⽅法结束时加⼀遍?这样始终不是办法,⽽且我们总是在改业务⽅法,在业务⽅法⾥⾯掺杂了太多的其他操作,侵⼊性太⾼。
这时候AOP就起到作⽤了,我们可以编写⼀个切⾯类(Aspect),在其中的⽅法中来编写横切逻辑(如打印⽇志),然后通过配置或者注解的⽅式来声明该横切逻辑起作⽤的位置。
⼆、实现技术?
AOP(这⾥的AOP指的是⾯向切⾯编程思想,⽽不是Spring AOP)主要的的实现技术主要有Spring AOP和AspectJ。
1、AspectJ的底层技术。
spring aop应用场景AspectJ的底层技术是静态代理,即⽤⼀种AspectJ⽀持的特定语⾔编写切⾯,通过⼀个命令来编译,⽣成⼀个新的代理类,该代理类增强了业务类,这是在编译时增强,相对于下⾯说的运⾏时增强,编译时增强的性能更好。
2、Spring AOP
Spring AOP采⽤的是动态代理,在运⾏期间对业务⽅法进⾏增强,所以不会⽣成新类,对于动态代理技术,Spring AOP提供了对JDK动态代理的⽀持以及CGLib的⽀持。
JDK动态代理只能为接⼝创建动态代理实例,⽽不能对类创建动态代理。需要获得被⽬标类的接⼝信息(应⽤Java的反射技术),⽣成⼀个实现了代理接⼝的动态代理类(字节码),再通过反射机制获得动态代理类的构造函数,利⽤构造函数⽣成动态代理类的实例对象,在调⽤具体⽅法前调⽤invokeHandler⽅法来处理。
CGLib动态代理需要依赖asm包,把被代理对象类的class⽂件加载进来,修改其字节码⽣成⼦类。
但是Spring AOP基于注解配置的情况下,需要依赖于AspectJ包的标准注解,但是不需要额外的编译以及AspectJ的织⼊器,⽽基于XML配置不需要。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论