👌什么是aop,aop的作用和优势

👌什么是aop,aop的作用和优势?

口语化回答

好的,面试官。aop 是 spring 框架的一个核心。常见的可以做日志记录,事务管理等公共性的处理。当我们想要统一做一些水平统一的操作的时候,就常用 aop。aop 的核心概念就是面向切面变成。通过 aop 可以在范围内的类方法执行之前,执行之后,或者异常的时候,做统一的操作。aop 可以提高代码的可维护性,任何修改只需要在切面中进行,而不需要修改业务逻辑代码。基于动态代理机制,还可以在不修改源代码的情况下为现有代码添加功能。在 boot 应用使用中,只需要配合Aspect 注解,即可实现功能,以上。

题目解析

aop 是核心问题,spring 里面的比较好的一个特性,因为实际工作中非常常用,面试官就会问你,是否有用过这一块的东西。

面试得分点

面向切面,模块化,减少重复代码

题目详细答案

AOP(面向切面编程)是一种编程范式,它旨在通过分离横切关注点来提高代码的模块化。AOP 在传统的面向对象编程(OOP)基础上,提供了一种处理系统级关注点(如日志记录、事务管理、安全性等)的机制,而这些关注点通常会散布在多个模块中。

AOP 的基本概念

Aspect(切面):切面是模块化的横切关注点。它可以包含多个 advice(通知)和 pointcut(切入点)。

Advice(通知):通知是切面在特定的切入点执行的动作。通知有几种类型:

  • Before:在方法执行之前执行。
  • After:在方法执行之后执行。
  • AfterReturning:在方法成功执行之后执行。
  • AfterThrowing:在方法抛出异常后执行。
  • Around:包围一个方法的执行,能够控制方法的执行前后。

Pointcut(切入点):切入点定义了通知应该应用到哪些连接点上。连接点是程序执行的特定点,如方法调用或异常抛出。

Join Point(连接点):程序执行的特定点,例如方法调用或异常抛出。

Weaving(织入):将切面应用到目标对象创建代理对象的过程。织入可以在编译时、类加载时、运行时进行。

AOP 的作用和优势

模块化横切关注点:AOP 允许将横切关注点(如日志记录、事务管理、安全性等)从业务逻辑中分离出来,从而提高代码的模块化和可维护性。

减少重复代码:通过将通用功能提取到切面中,可以减少代码的重复,提高代码的可读性和可维护性。

提高代码的可维护性:由于横切关注点被模块化为切面,任何修改只需要在切面中进行,而不需要修改业务逻辑代码,从而提高了代码的可维护性。

动态代理:AOP 使用动态代理机制,可以在不修改源代码的情况下为现有代码添加功能。

增强代码的可测试性:由于横切关注点被分离成切面,业务逻辑代码变得更加简洁和专注,从而提高了代码的可测试性。

AOP 的应用场景

日志记录:在方法调用前后记录日志。

事务管理:在方法执行前开启事务,在方法执行后提交事务,在方法抛出异常时回滚事务。

安全性检查:在方法执行前进行权限检查。

性能监控:在方法执行前后记录执行时间。

缓存:在方法调用前检查缓存,在方法调用后更新缓存。

示例代码

定义切面

1
2
3
4
5
6
7
8
9
10
11
12
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class LoggingAspect {
@Before("execution(* com.example.service.*.*(..))")
public void logBefore() {
System.out.println("Logging before method execution");
}
}

配置 Spring 应用

1
2
3
4
5
6
7
8
9
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;

@Configuration
@ComponentScan(basePackages = "com.example")
@EnableAspectJAutoProxy
public class AppConfig {
}

使用 AOP 的服务类

1
2
3
4
5
6
7
8
import org.springframework.stereotype.Service;

@Service
public class MyService {
public void performTask() {
System.out.println("Performing task");
}
}

主应用

1
2
3
4
5
6
7
8
9
10
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class MainApp {
public static void main(String[] args) {
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
MyService myService = context.getBean(MyService.class);
myService.performTask();
}
}

LoggingAspect切面会在每次调用MyService中的方法时记录日志,而无需修改MyService的源代码。 AOP 通过分离横切关注点来提高代码的模块化和可维护性。

 wechat
天生我才必有用