wuqiu-ai / daily-interviews

java面试之每日一练
0 stars 0 forks source link

[Spring] 你了解Spring AOP么 第22天 2020-09-17 #97

Open wuqiu-ai opened 4 years ago

wuqiu-ai commented 4 years ago

你了解Spring AOP么?

wuqiu-ai commented 4 years ago

Aop的三种织入方式

  1. 编译时织入:需要特殊的java编译器,如Aspectj
  2. 类加载是织入:需要特殊的java编译器,如AspectJ和AspectWerkz
  3. 运行时织入:Spring采用的方式,通过动态代理的方式,实现简单

Aop的主要名词概念

  1. Aspect:通用功能的代码实现
  2. Target:被织入Aspect的对象
  3. Join Point:可以作为切入点的机会,所有方法都可以作为切入点
  4. Pointcut:Aspect实际被应用在的Join Point,支持正则
  5. Advice:类里的方法以及这个方法如何织入到目标方法的方式
  6. Weaving:Aop的实现过程

Advice的种类

  1. 前置通知(Before)
  2. 后置通知(AfterReturning)
  3. 异常通知(AfterThrowing)
  4. 最终通知(After)
  5. 环绕通知(Around)
wuqiu-ai commented 4 years ago

AOP的实现:JDKProxy和Cglib

  1. 由AopProxyFactory根据AdvicedSupport对象的配置来决定
  2. 默认策略如果目标类是接口,则用JDKProxy来实现,否则用后者
  3. JDKProxy的核心:InvocationHandler接口和Proxy类
  4. Cglib:以继承的方式动态生成目标类的代理

底层原理

JDKProxy:通过java的内部反射机制实现 Cglib:通过ASM实现 反射机制在类的过程中比较高效; ASM在生成类之后的执行过程中比较高效;

Spring里的代理模式实现

  1. 真实实现类的逻辑包含在了getBean方法里
  2. getBean方法返回的实际上是Proxy的实例
  3. Proxy实例是Spring采用JDK Proxy或Cglib动态生成