AOP面向切面编程详解(原理实例及应用场景)

AOP面向切面编程详解(原理实例及应用场景)-mikechen

AOP面向切面编程定义

AOP,全称是Aspect-Oriented Programming,翻译过来就是面向切面编程,是一种编程思想,它是在OOP面向对象编程的补充。

 

AOP面向切面编程原理

AOP的核心思想是将程序的业务逻辑和横切逻辑分离,并通过切面(Aspect)的方式将其与核心关注点组合在一起,形成一个完整的应用程序。

在AOP中我们通过定义横切关注点和切面来实现对系统的功能进行增强或修改,而不是直接修改原有代码。

比如:Spring AOP面向切面编程,可以实现、日志记录、事务管理、权限验证等功能的增强。

如下图所示:

AOP面向切面编程详解(原理实例及应用场景)-mikechen

AOP主要通过以下三个组成部分来实现:

1.切面(Aspect)

切面是一组与特定横切关注点相关的行为,通常以类的形式实现。

切面定义了要在哪个地方(连接点)、要拦截哪些方法(切点),以及要执行什么样的横切逻辑(通知)。

 

2.连接点(Join Point)

连接点是程序执行过程中的某个特定点,如方法调用、属性访问等。

切面可以定义在连接点的前、后或者环绕执行,从而实现对连接点的拦截和横切逻辑的应用。

 

3.通知(Advice)

通知是切面定义的实际横切逻辑,可以是在连接点前、后或者环绕执行的代码段。

常见的通知类型包括前置通知(Before)、后置通知(After)、返回通知(AfterReturning)、异常通知(AfterThrowing)和环绕通知(Around)。

 

AOP面向切面编程示例

假设我们有一个业务逻辑类UserService,其中有一个方法getUserById,我们需要在这个方法调用前记录日志。

我们可以使用AOP来实现这个功能,如下所示:

@Aspect
@Component
public class LoggingAspect {

    private static final Logger logger = LoggerFactory.getLogger(LoggingAspect.class);

    @Before("execution(* com.example.UserService.getUserById(Long)) && args(userId)")
    public void logBeforeGetUserById(Long userId) {
        logger.info("Fetching user with ID: " + userId);
    }

    @AfterReturning("execution(* com.example.UserService.getUserById(Long)) && args(userId)")
    public void logAfterGetUserById(Long userId) {
        logger.info("User with ID: " + userId + " fetched successfully");
    }

    @AfterThrowing(pointcut = "execution(* com.example.UserService.*(..))", throwing = "exception")
    public void logAfterThrowingGetUserById(Exception exception) {
        logger.error("Error during method execution: " + exception.getMessage());
    }
}

在上面的代码中:

1.我们使用@Aspect注解来声明LoggingAspect是一个切面;

2.使用@Before、@AfterReturning和@AfterThrowing注解来定义切面的通知(Advice)。

  • @Before注解表示在目标方法调用之前执行通知;
  • @AfterReturning注解表示在目标方法成功返回后执行通知;
  • @AfterThrowing注解表示在目标方法抛出异常时执行通知。

3.在通知的方法中,我们使用AspectJ切点表达式来定义切点。

其中execution(* com.example.UserService.getUserById(Long))表示匹配getUserById(Long)方法。

 

AOP面向切面编程应用场景

AOP面向切面编程应用场景,主要应用于通过将系统中的横切关注点从核心业务逻辑中分离出来的场景。

比如:

  1. 日志记录:记录系统运行日志、调试信息等。
  2. 性能监控:对系统的性能进行监控,例如记录方法的执行时间、调用次数等。
  3. 安全控制:对系统中的敏感操作进行权限控制。
  4. 事务管理:在一组操作中保持数据的一致性,例如在数据库操作中开启事务,保证多个操作的原子性。

以上就是AOP面向切面编程详解,更多内容请查看:Spring AOP全面详解(超级详细)

陈睿mikechen

10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

关注「mikechen」公众号,获取更多技术干货!

后台回复面试即可获取《史上最全阿里Java面试题总结》,后台回复架构,即可获取《阿里架构师进阶专题全部合集

评论交流
    说说你的看法