AOP

发布时间 2023-12-19 10:33:04作者: 梅丹隆

一、特点

关注点分离:不同的问题交给不同的部分去解决

  1. 面向切面编程AOP正式此种技术的体现
  2. 通用化功能代码的实现,对应的就是所谓的切面(Aspest)
  3. 业务功能代码和切面代码分开后,架构将变得高内聚低耦合
  4. 确保功能的完整性:切面最终需要被合并到业务中(Weave)

二、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的实现过程

四、AOP原理

1、AOP实现

JdkProxyCglib

  1. 由AopProxyFactory根据AdvisedSupport对象的配置来决定
  2. 默认策略如果目标类是接口,则用JDKProxy来实现,否则用后者
  3. JDKProxy的核心:InvocationHandler接口和Proxy类
    1. 通过Java的内部反射机制实现
    2. 反射机制在生成类的过程中比较高效
  4. Cglib:以继承的方式动态生成目标类的代理
    1. 借助ASM实现 - 操作字节码的框架
    2. ASM在生成类之后的执行过程中比较高效(ASM类可进行缓存,解决生成类低效问题)

2、代理模式

接口 + 真实实现类 + 代理类

3、Spring里的代理模式的实现

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

源码线索:

  1. AbstractAutowireCapableBeanFactory#doCreateBean
  2. AbstractAutowireCapableBeanFactory#initializeBean(beanName, exposedObject, mbd)
  3. AbstractAutowireCapableBeanFactory#applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName)
  4. AbstractAutoProxyCreator#postProcessAfterInitialization
  5. AbstractAutoProxyCreator#wrapIfNecessary(bean, beanName, cacheKey)
  6. AbstractAutoProxyCreator#createProxy(bean.getClass(), beanName, specificInterceptors, new SingletonTargetSource(bean))
  7. AbstractAutoProxyCreator#getProxy(classLoader)
  8. ProxyFactory#createAopProxy().getProxy(classLoader)
  9. DefaultAopProxyFactory#createAopProxy