👌什么是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 | import org.aspectj.lang.annotation.Aspect; |
配置 Spring 应用
1 | import org.springframework.context.annotation.ComponentScan; |
使用 AOP 的服务类
1 | import org.springframework.stereotype.Service; |
主应用
1 | import org.springframework.context.ApplicationContext; |
LoggingAspect切面会在每次调用MyService中的方法时记录日志,而无需修改MyService的源代码。 AOP 通过分离横切关注点来提高代码的模块化和可维护性。