10 06 2025

一:概念介绍


 AOP利用一种称为“横切”的技术,剖解开封装的对象内部,并将那些影响了 多个类的公共行为封装到一个可重用模块,并将其名为“Aspect”,即方面。


所谓“方面”,简单地说,就是将那些与业务无关,却为业务模块所共同调用的 逻辑或责任封装起来,比如日志记录,便于减少系统的重复代码,降低模块间的耦合度,


并有利于未来的可操作性和可维护性。


Spring AOP使用纯Java实现,不需要专门的编译过程和类加载器,在运行期通过代理方式向目标类织入增强代码,Spring2.0之后,Spring AOP引入对Aspectj的支持,AspecJ


是一个基于Java语言的AOP框架。


主要应用场景:


事务管理,记录日志,监测性能(统计运行时间),权限控制,缓存


目的:将日志记录,性能统计,安全控制,事务处理等代码从业务逻辑代码中划分出来,通过对这些行为的分离,我们希望可以将它们独立到非指导业务逻辑的方法


中,进而改变这些行为的时候不影响业务逻辑的代码。


AOP相关术语


Joinpoint(连接点):所谓连接点是指那些被拦截到的点,在Spring中,这些点指的是方法,因为Spring只支持方法类型的连接点


Pointcut(切入点):所谓的切入点是指我们要对哪些Joinpoint进行拦截的定义


Advice(通知/增强):所谓通知是指拦截到Joinpoint之后所要做的事情就是通知,通知分为前置通知,后置通知,异常通知,最终通知,环绕通知(切面要完成的事情)。


Introduction(引介):引介是一种特殊的通知,在不修改类代码的前提下,Introduction可以在运行期为类动态的添加一些方法或Field。


Target:代理的目标对象。


Weaving(织入):是指把增强应用到目标对象来创建的代理对象的过程,Spring采用动态代理织入,而AspectJ采用编译期织入和类装载期织入。


Proxy(代理):一个类被AOP织入增强后,就产生一个结果代理类。


Aspect(切面):是切入点和通知(引介)的结合。


代理模式:


静态代理模式


所谓静态代理就是AOP框架会在编译阶段生成AOP代理类,因此也称为编译时增强。ApsectJ是静态代理的实现之一,也是最为流行的。静态代理由于在编译时就生成


了代理类,效率相比动态代理要高一些。AspectJ可以单独使用,也可以和Spring结合使用。


动态代理模式


与静态代理不同,动态代理就是说AOP框架不会去修改编译时生成的字节码,而是在运行时在内存中生成一个AOP代理对象,这个AOP对象包含了目标对象的全部方


法,并且在特定的切点做了增强处理,并回调原对象的方法。


二:样例(采用识别自定义注解方式)


自定义注解类


@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
@Documented
public @interface CustomerLog {
    String value() default "开始记录日志...";
}


切面


@Aspect
@Component
@Slf4j
public class LogAspect {
  @After("@annotation(CustomerLog)")
  public void recordLog(JoinPoint joinPoint) throws Throwable{
    Object[] args = joinPoint.getArgs();
    log.info("{}",args);
  }
}


切入点


@Service
public class LogService {
  @CustomerLog
  public void recordLog(String msg){}
}