(面试题)详细解释Spring中的AOP

365 阅读2分钟

什么是AOP

  • AOP,叫做面向切面编程,也就是将通用处理(日志、权限)封装成切面,跟业务逻辑进行分离

作用

  • 降低系统耦合度,将通用处理和业务逻辑代码进行分离,可以不修改业务代码实现方法的增强
  • 实现代码复用,将通用处理封装成切面,方便其他方法拿来即用

静态代理(了解即可)

含义:在编译期对类进行增强,可以自己手写代理类增强,也可以使用AspectJ等框架

缺点:1. 不灵活,如果代理类和目标类共同接口添加了方法,我还要在代理类实现这个方法

2.类爆炸,如果要增强100个目标类,静态代理就要写100个增强类,但是动态代理可能两行代码就能实现

动态代理(重要)

  • 含义:使用反射在程序运行时动态生成代理类对目标进行增强

  • 具体实现

    • JDK动态代理(基于接口实现)
    • CGLIB动态代理(基于继承实现)
  • 使用限制(也可以理解为JDK和CGLIB的缺点):

    • 如果目标类实现了接口,就可以用JDK或者CGLIB
    • 如果目标类没有实现接口,只能用CGLIB
    • 如果目标类用final修饰,表示不可继承,就不能用CGLIB动态代理
  • 效率问题:在jdk1.8中,JDK动态代理速度要快于CGLIB动态代理。

  • 应用:当我们为某个Bean配置了切面后,这个Bean就被加载到容器中,实际加载的是这个Bean的代理对象而不是原始Bean。在Spring中,如果这个Bean有接口,就使用JDK动态代理,否则使用CGLIB动态代理。

如何使用

记住三个关键点:切入点,通知,切面

AOP主要解决的就是三件事:

  • Pointcut切入点:对哪个方法进行增强
  • Advice通知:对方法什么时候增强,比如说执行前,执行后,环绕增强
  • 做哪些增强,看业务需要 还有一个Aspect切面,java中万物皆对象,需要一个封装切面的类就是切面,包含切入点和通知

3.png